8

我试图在使用 AKKA.NET 构建的目录管理应用程序中了解 CQRS 的查询端。我有一个 UI 需要在遵循标准的网格中显示所有产品。标准可以是来自供应商 A 的所有产品,并且该标准在 UI 上的表单中输入。

我的问题是这个查询是如何完成的?我应该去哪里运行查询?我应该将所有产品参与者加载到内存中以进行查询吗?或者我应该去保存状态的持久媒体?在我获得所有查询成功的产品 id 后,我应该使用这些产品 id 来激活所有参与者吗?

请指教。

4

2 回答 2

5

您的问题听起来不像是严格与演员相关的,因为它更像是CQRS 与 CRUD特征。在标准 CQRS 场景中,您希望有某种持久存储,其架构已根据您的读取模型进行调整。然后你可以在它上面运行你的查询。

在基于 CQRS 但还没有事件溯源的场景中使用 Akka.NET,我想到的一件事是利用 Akka 事件总线。当您启动一个应用程序时,创建负责更新您的读取模型的参与者并立即将它们订阅到 Akka 事件总线以侦听表示该读取模型必须更新的消息。然后在任何可能引发读取端更改的参与者中,发布相关的事件/消息。

如果您使用事件溯源,您可能想看看Akka.Peristence. 在那里,您有一个由所谓的持久参与者创建的事件日志的概念。它描述了一个actor进行的所有操作的流,这些操作应该已经被存储了。第二件事是另一种称为持久视图的参与者,它可能与特定的事件流相关联并从中构建读取模型。虽然持久视图通常与单个持久参与者相关联,但您可以再次使用事件总线 + 侦听器来创建全局读取模型。这种方法的优点之一是所有事件都存储在持久存储中,使您的系统更耐用,并且在发生故障时更容易恢复。

于 2015-05-12T09:57:01.627 回答
4

或者,您可以颠倒您的想法并创建一个表示查询的 Actor。如果您正在查询“产品”对象以查找来自供应商 A 的所有产品,那么每个产品对象都会向您的查询参与者发送其当前状态的更新,如果它来自供应商 A,您的查询参与者会处理将其添加到其集合中的对象等. 您的查询参与者将过滤掉不符合查询参数的对象。现在您有一个包含产品列表的参与者,该列表随着新产品的创建、更改等而实时更新。

于 2015-08-21T07:15:50.870 回答