Akka:PersistenceQuery如何替代PersistentView?

时间:2017-06-22 11:52:26

标签: stream akka persistence reactive-programming

我们在代码中使用PersistentView作为群集单例,以减轻来自读取事件的负载。现在,PersistentView被弃用,建议我们使用基于Stream API的PersistentQuery。我们有:

  

消费者可以是普通的演员,也可以是PersistentActor   需要存储自己的状态(例如fromSequenceNr offset)。   相应的查询类型是EventsByPersistenceId。有   将Source连接到actor的几种替代方法   对应于先前的PersistentView actor:

我的问题是:

  1. PersistentView中,事件在接收块中处理,我们有一个基于推送的系统。使用PersistentQuery时,对EventsByPersistenceId等的每次调用就像拉动一样。我如何模仿演员中的持续receive行为?我应该这样做吗?这真的是Streams应该被使用的方式。

  2. 我的理解是每次调用get EventsByPersistenceId本质上都是一个查询。因此,这样做循环查询效率不高吗?

  3. 我也很想知道为什么PersistentView被删除了。这仅仅是一个优化,还是Akka关于迁移到溪流的更广泛行动的一部分,这是一种范式转变?我是否在尝试使用PersistentView模仿PersistenceQuery行为时犯了错误?

  4. 我遇到了这个repo,它似乎在窗帘后面使用PersistentView时提供了旧的PersistenceQuery功能。根据^?

  5. 中的注意事项使用它是否是个好主意

2 个答案:

答案 0 :(得分:2)

  1. 正如您所提到的,eventsByPersistenceId会给您一个Akka Streams Source,因此有点不清楚您的意思是"每次通话"。您可以从此源定义流并将其实现一次,然后由它发出新事件。除其他外,您可以将其发送给演员,将PersistentView替换为mapAsyncaskhttp://doc.akka.io/docs/akka/snapshot/scala/persistence-query.html#materialize-view-using-mapasynchttp://doc.akka.io/docs/akka/current/scala/stream/stream-integrations.html#mapasync-ask解释了这种方法 所以从你的演员的角度来看,它仍然是基于推动的"并由receive处理。 请注意,mapAsync在第一个参数列表中采用并行因子。要按照事件发生的顺序处理事件,您应该将事件设置为" 1" (即没有平行)。如果将其设置为更高的值,例如 n ,则流将采用 n 事件并将消息并行发送给actor,这意味着它们最终会在邮箱按随机顺序。
  2. 再次,你是怎么说"每次通话"?它可能只是一个 - 您在启动时运行/实现流,它将无限期地传输事件。基础日志插件实现很可能使用轮询,这是正确的。 (我不知道,但我怀疑PersistentView也是如此?)所以你肯定不想创建大量的这些来源。但是,如果您对来自许多演员的事件感兴趣,您更有可能标记事件,然后使用eventsByTag获取具有给定标记的所有事件的来源。
  3. 当时对此有一些讨论。用我自己的话来说,我说用于单个演员的视图/阅读侧的用例并不常见。为了构建基于Akka Persistence的CQRS系统,需要一种更强大的方式来消费任何事件集并以任意方式处理它们,这使得流查询成为更好的选择。在Akka团队的话中,设计决定在Akka Persistence on the Query Side: The Conclusion中解释。
  4. 我不了解图书馆,即使我这样做了,如果不知道你的用例,即你在接收演员中实际做了什么,就很难说。就个人而言,我对PersistenceQuery感到满意,并且没有看到模仿PersistentView的需要,特别是因为将事件从流发送给演员相当容易正如1中所述。

答案 1 :(得分:0)

repository使用PersistenceQuery来摧毁,并使用Stream API提供了非常轻量级的Akka已弃用PersistentView的重新实现。