我们在代码中使用PersistentView作为群集单例,以减轻来自读取事件的负载。现在,PersistentView
被弃用,建议我们使用基于Stream API的PersistentQuery
。我们有:
消费者可以是普通的演员,也可以是PersistentActor 需要存储自己的状态(例如fromSequenceNr offset)。 相应的查询类型是EventsByPersistenceId。有 将Source连接到actor的几种替代方法 对应于先前的PersistentView actor:
我的问题是:
在PersistentView
中,事件在接收块中处理,我们有一个基于推送的系统。使用PersistentQuery
时,对EventsByPersistenceId
等的每次调用就像拉动一样。我如何模仿演员中的持续receive
行为?我应该这样做吗?这真的是Streams应该被使用的方式。
我的理解是每次调用get EventsByPersistenceId
本质上都是一个查询。因此,这样做循环查询效率不高吗?
我也很想知道为什么PersistentView
被删除了。这仅仅是一个优化,还是Akka关于迁移到溪流的更广泛行动的一部分,这是一种范式转变?我是否在尝试使用PersistentView
模仿PersistenceQuery
行为时犯了错误?
我遇到了这个repo,它似乎在窗帘后面使用PersistentView
时提供了旧的PersistenceQuery
功能。根据^?
答案 0 :(得分:2)
eventsByPersistenceId
会给您一个Akka Streams Source
,因此有点不清楚您的意思是"每次通话"。您可以从此源定义流并将其实现一次,然后由它发出新事件。除其他外,您可以将其发送给演员,将PersistentView
替换为mapAsync
和ask
。 http://doc.akka.io/docs/akka/snapshot/scala/persistence-query.html#materialize-view-using-mapasync和http://doc.akka.io/docs/akka/current/scala/stream/stream-integrations.html#mapasync-ask解释了这种方法
所以从你的演员的角度来看,它仍然是基于推动的"并由receive
处理。
请注意,mapAsync
在第一个参数列表中采用并行因子。要按照事件发生的顺序处理事件,您应该将事件设置为" 1" (即没有平行)。如果将其设置为更高的值,例如 n ,则流将采用 n 事件并将消息并行发送给actor,这意味着它们最终会在邮箱按随机顺序。PersistentView
也是如此?)所以你肯定不想创建大量的这些来源。但是,如果您对来自许多演员的事件感兴趣,您更有可能标记事件,然后使用eventsByTag
获取具有给定标记的所有事件的来源。PersistenceQuery
感到满意,并且没有看到模仿PersistentView
的需要,特别是因为将事件从流发送给演员相当容易正如1中所述。答案 1 :(得分:0)
此repository使用PersistenceQuery
来摧毁,并使用Stream API提供了非常轻量级的Akka已弃用PersistentView
的重新实现。