【问题标题】:Query in AKKA.NET在 AKKA.NET 中查询
【发布时间】:2015-07-21 10:27:46
【问题描述】:

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

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

请指教。

【问题讨论】:

    标签: akka.net


    【解决方案1】:

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

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

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

    【讨论】:

    • 您回答了我关于应该在哪里运行查询的问题。据我所知,它应该针对持久状态而不是内存状态。
    • 我的理解是否正确,如果我使用 Akka.Persistence,那么我不应该需要另一个事件源系统,如 NEventStore 或 getEventStore? Akka.Persistence 是否足以实现事件溯源?如果不需要,我不想在我的系统中添加额外的组件?
    • @Damian 我相信您在谈论 Akka.NET Persistence 而不是 AKKA(Java 或 Scala 版本)。我没有看到任何将 Akka.NET 持久性用作事件源的示例。 NEventStore 和 getEventStore 是成熟的产品,NEventStore 可以使用许多持久存储,如 MongoDB、RavenDB、Azure Blob。 Akka.NET 持久性可能不是这种情况。我还有一些问题,比如它将支持什么商店等等......
    • @Damian Akka.Persistence 可用于事件溯源,当我们谈论演员的范围时。您还需要一些用于持久性提供程序引擎的集成插件——目前我了解 SQL Server、PostgreSQL、Cassandra 和 EventStore。如果您想将 ES 应用于某些未建模为持久参与者的应用程序组件,那么您将需要一些额外的依赖项。
    • @Damian 我创建了一个example,但还没有完成。
    【解决方案2】:

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

    【讨论】:

    • 但是在请求响应场景中如何从这个actor中获取数据?类休息界面?
    • 它是一个演员,所以你必须向它发送一条请求数据的消息。它将管理自己的状态,但您希望当前状态在请求时位于内存中。该请求将进入其消息队列,因此它可能落后于查询对象的其他更新,但这是预期且通常首选的行为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多