Akka-持久性,evnet从一个参与者迁移到另一个参与者

zd287kbt  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个关于akka持久性和事件迁移的问题,我确实读过"Schema Evolution for Event Sourced Actors"一章,但是这并没有回答我的问题。
假设我有一个产生Created事件的持久化参与者ChildActor。但是,后来我们发现ChildActor应该是ParentActor的子。并且ParentActor必须基于ChildActor的创建来更新其状态(以维护子集合)。
我们可以为ParentActor添加一个新的命令CreateChild来创建ChildActor。但是,父节点永远不会接收到其子节点发出的Created事件。因此,它将无法更新其子节点的状态。当然,ParentActor可以为自己创建一个ChildCreated事件。
但是,FirstActor已经持久化的Created事件怎么办?
我们如何将它们"发送"(理想情况下是适应)到ParentActor
所以,我的问题是:
我们可以将持久化事件从一个参与者"路由"到另一个参与者吗?
谢谢

sxissh06

sxissh061#

可以使用按持久化ID查询的事件来查看由给定持久化ID持久化的事件。由于此查询非常类似于Akka Persistence在重放事件以重建持久化参与者状态时必须执行的操作,因此它在所有常用插件中都可用:你需要查看插件的文档来了解如何召唤ReadJournal,一旦召唤完成,假设ReadJournalEventsByPersistenceIdQuery的另一个示例,你可以使用(Scala):

readJournal.eventsByPersistenceId(childActorPersistenceId, fromOffset, Long.MaxValue)

这将为您提供一个Akka Streams Source事件,从fromOffset开始。您的订阅参与者可能(很可能)希望将最后看到的序列号保存在其状态中,作为其状态的一部分,以便在它恢复时看不到它处理的事件(理想情况下,更新序列号的事件将在同一批中,或者是状态更新的原子部分)。
请注意,从持久化事件到ParentActor看到事件之间会有一个明显的延迟,尽管许多插件(例如Cassandra或R2DBC)的最新迭代可以直接传播事件,或者至少传播存在持久化ID的事件的通知给查询。

相关问题