我有一个关于akka持久性和事件迁移的问题,我确实读过"Schema Evolution for Event Sourced Actors"一章,但是这并没有回答我的问题。
假设我有一个产生Created
事件的持久化参与者ChildActor
。但是,后来我们发现ChildActor
应该是ParentActor
的子。并且ParentActor
必须基于ChildActor
的创建来更新其状态(以维护子集合)。
我们可以为ParentActor
添加一个新的命令CreateChild
来创建ChildActor
。但是,父节点永远不会接收到其子节点发出的Created
事件。因此,它将无法更新其子节点的状态。当然,ParentActor
可以为自己创建一个ChildCreated
事件。
但是,FirstActor
已经持久化的Created
事件怎么办?
我们如何将它们"发送"(理想情况下是适应)到ParentActor
?
所以,我的问题是:
我们可以将持久化事件从一个参与者"路由"到另一个参与者吗?
谢谢
1条答案
按热度按时间sxissh061#
可以使用按持久化ID查询的事件来查看由给定持久化ID持久化的事件。由于此查询非常类似于Akka Persistence在重放事件以重建持久化参与者状态时必须执行的操作,因此它在所有常用插件中都可用:你需要查看插件的文档来了解如何召唤
ReadJournal
,一旦召唤完成,假设ReadJournal
是EventsByPersistenceIdQuery
的另一个示例,你可以使用(Scala):这将为您提供一个Akka Streams
Source
事件,从fromOffset
开始。您的订阅参与者可能(很可能)希望将最后看到的序列号保存在其状态中,作为其状态的一部分,以便在它恢复时看不到它处理的事件(理想情况下,更新序列号的事件将在同一批中,或者是状态更新的原子部分)。请注意,从持久化事件到
ParentActor
看到事件之间会有一个明显的延迟,尽管许多插件(例如Cassandra或R2DBC)的最新迭代可以直接传播事件,或者至少传播存在持久化ID的事件的通知给查询。