我正在使用scala api进行akka持久化,以持久保存一组组织成树的actor实例。树中的每个节点都是一个持久角色,并根据从“根”节点到该节点的路径进行命名。 persistenceId设置为名称。例如,根节点参与者具有persistenceId'root'。下一个向下的节点具有persistenceId'root-europe'。另一个 Actor 可能具有persistenceId'root-europe-italy'。

每个参与者的状态都包括其子代的名字列表。例如。作为其状态的一部分,“根” Actor 会保留“欧洲”,“亚洲”等 list 。

我已经为此系统实现了快照。当根触发快照时,它会这样做,然后告诉每个 child 执行相同的操作。

在快照恢复期间出现问题。当我用persistenceId ='root'重新创建一个actor时(通过将名称作为构造函数参数传入),该actor接收到的SnapshotOffer事件是错误的。例如,它是“root-europe-italy ....”。这似乎是持久性契约(Contract)的矛盾,其中persistenceId标识要恢复的参与者状态。我通过反转节点参与者的persistenceId(例如'italy-europe-root')来解决此问题,因此这似乎与持久性模块检索文件的方式有关。请注意,我首先尝试了其他方法,例如,在节点名称之间使用了各种分隔符,或者根本没有分隔符。

有没有其他人遇到过这个问题,或者akka持久性开发人员可以帮助我理解为什么会发生这种情况?

顺便说一句:我现在正在使用基于文件的内置快照存储。

谢谢。

最佳答案

好的-问题出在Akka,现在已经解决了。请参阅related ticket以了解何时发布了补丁。

09-13 11:00