AKKA.NET中的查询

AKKA.NET中的查询,akka.net,Akka.net,我试图理解用AKKA.NET构建的目录管理应用程序中CQRS的查询端。我有一个UI,它需要在一个网格中显示符合标准的所有产品。标准可以是来自供应商A的所有产品,并且该标准在UI上的表单中输入 我的问题是这个查询是如何完成的?我应该去哪里运行查询?我应该将所有产品参与者加载到内存中进行查询吗?还是应该转到保存状态的持久介质?在我获得查询成功的所有产品ID之后,我应该使用这些产品ID来激活所有参与者 请给出建议。您的问题听起来不像是严格的演员相关问题,因为这更像是CQR与CRUD的特征。在标准的CQ

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

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


请给出建议。

您的问题听起来不像是严格的演员相关问题,因为这更像是CQR与CRUD的特征。在标准的CQRS场景中,您希望拥有某种持久性存储,并根据您的读取模型调整模式。然后,您可以对其运行查询

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


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

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

您回答了我关于查询应在何处运行的问题。正如我现在所理解的,它应该是针对持久状态的,而不是内存中的状态。我的理解是否正确,如果我使用Akka.Persistence,那么我不应该需要另一个事件源系统,如NEventStore或getEventStore?Akka.Persistence是否足以实现事件源?如果不需要,我不想在我的系统中添加额外的组件?@Damian我相信你说的是Akka.NET持久性,而不是Akka(Java或Scala版本)。我没有看到任何Akka.NET持久性被用作事件源的例子。NEventStore和getEventStore是成熟的产品,NEventStore可以使用许多持久存储,如MongoDB、RavenDB、Azure Blob。Akka.NET持久性可能不是这种情况。我也有一些问题,比如它将支持什么商店等等。@Damian Akka。当我们在演员范围内讨论时,持久性可以用于事件来源。您还需要一些持久性提供程序引擎的集成插件——目前我了解SQL Server、PostgreSQL、Cassandra和EventStore。如果您想将ES应用于某些未建模为持久参与者的应用程序组件,则需要一些额外的依赖项。@Damian我已创建了一个,但尚未完成。但是如何从该参与者中获取数据。。。在请求-响应场景中?rest-like接口?它是一个参与者,所以您必须向它发送一条请求数据的消息。它将管理自己的状态,但您希望当前状态在请求时位于内存中。请求将进入其消息队列,因此它可能在查询对象的其他更新之后,但这是预期的和通常首选的行为