在 AKKA.NET 中查询
Query in AKKA.NET
我正在尝试了解使用 AKKA.NET 构建的目录管理应用程序中 CQRS 的查询端。我有一个 UI,它需要在一个符合条件的网格中显示所有产品。条件可以是来自供应商 A 的所有产品,并且此条件在 UI.
的表格中输入
我的问题是这个查询是如何完成的?我应该去哪里运行查询?我是否应该将所有产品演员加载到内存中以进行查询?或者我应该去保存状态的持久性媒体?在我得到所有查询成功的产品 ID 之后,我应该使用这些产品 ID 来激活所有的参与者吗?
请指教
你的问题听起来不像严格意义上的演员相关,因为它更 CQRS vs. CRUD 特征。在标准 CQRS 场景中,您希望拥有某种持久性存储,其架构已根据您的读取模型进行了调整。然后你就可以运行你的查询了。
在基于 CQRS 但 尚未事件溯源 的场景中使用 Akka.NET 我想到的一件事是利用 Akka 事件总线。当您启动一个应用程序时,创建负责更新您的读取模型的参与者,并立即将它们订阅到 Akka 事件总线以收听表示读取模型必须更新的消息。然后在任何可能引起读端变化的actor中,发布一个相关的event/message.
如果您正在使用事件溯源,您可能想看看 Akka.Peristence
。那里有一个由所谓的持久性参与者创建的事件日志的概念。它描述了一个演员所做的所有操作的流,这些操作应该被存储。第二件事是另一种称为持久视图的参与者,它可能与特定的事件流相关联并从中构建读取模型。虽然持久视图通常与单个持久 actor 相关,但您可以再次使用事件总线 + 侦听器来创建全局读取模型。这种方法的优点之一是所有事件都存储在持久存储中,使您的系统更耐用,并且在发生故障时更容易恢复。
或者您可以颠覆您的想法并创建一个表示查询的 Actor。如果您正在查询 "Products" 对象以查找来自供应商 A 的所有产品,那么每个产品对象都会向您的查询参与者发送其当前状态的更新,如果它来自供应商 A,则您的查询参与者处理该对象并将其添加到其集合等。您的查询参与者将过滤掉不符合查询参数的对象。
现在您有一个包含产品列表的 actor,随着新产品的创建、更改等,该列表会实时更新。
我正在尝试了解使用 AKKA.NET 构建的目录管理应用程序中 CQRS 的查询端。我有一个 UI,它需要在一个符合条件的网格中显示所有产品。条件可以是来自供应商 A 的所有产品,并且此条件在 UI.
的表格中输入我的问题是这个查询是如何完成的?我应该去哪里运行查询?我是否应该将所有产品演员加载到内存中以进行查询?或者我应该去保存状态的持久性媒体?在我得到所有查询成功的产品 ID 之后,我应该使用这些产品 ID 来激活所有的参与者吗?
请指教
你的问题听起来不像严格意义上的演员相关,因为它更 CQRS vs. CRUD 特征。在标准 CQRS 场景中,您希望拥有某种持久性存储,其架构已根据您的读取模型进行了调整。然后你就可以运行你的查询了。
在基于 CQRS 但 尚未事件溯源 的场景中使用 Akka.NET 我想到的一件事是利用 Akka 事件总线。当您启动一个应用程序时,创建负责更新您的读取模型的参与者,并立即将它们订阅到 Akka 事件总线以收听表示读取模型必须更新的消息。然后在任何可能引起读端变化的actor中,发布一个相关的event/message.
如果您正在使用事件溯源,您可能想看看 Akka.Peristence
。那里有一个由所谓的持久性参与者创建的事件日志的概念。它描述了一个演员所做的所有操作的流,这些操作应该被存储。第二件事是另一种称为持久视图的参与者,它可能与特定的事件流相关联并从中构建读取模型。虽然持久视图通常与单个持久 actor 相关,但您可以再次使用事件总线 + 侦听器来创建全局读取模型。这种方法的优点之一是所有事件都存储在持久存储中,使您的系统更耐用,并且在发生故障时更容易恢复。
或者您可以颠覆您的想法并创建一个表示查询的 Actor。如果您正在查询 "Products" 对象以查找来自供应商 A 的所有产品,那么每个产品对象都会向您的查询参与者发送其当前状态的更新,如果它来自供应商 A,则您的查询参与者处理该对象并将其添加到其集合等。您的查询参与者将过滤掉不符合查询参数的对象。 现在您有一个包含产品列表的 actor,随着新产品的创建、更改等,该列表会实时更新。