Petabridge blog's Akka.Persistence intro表明您不能拥有多个具有相同PersistenceId的角色:
PersistenceId
字段很重要 - 它使用Akka.Persistence唯一标识一个持久化状态的实体,并且在任何给定时间应该只有一个持久化actor用于单个PersistenceId
。< / p>[...]所以想象一下,如果你有两个具有相同PersistenceId但序列号不同的actor写入同一个商店。这将是混乱并且将不可避免地出错 - 所以这就是为什么每个PersistenceId在你的ActorSystem中是全局唯一的至关重要(至少对于写入该商店的所有演员来说都是如此。)
我可以想到一个场景,你将有两个独立的actor:一个负责将持久性状态保存到数据库(即调用Persist()
),另一个用于在手动请求时重放来自日志的消息这样做(即调用Recover()
)。读写操作将来自不同的参与者。只有一个人写过,只有一个人读过。但是,两者都需要相同的PersistenceId。
我相信在这种情况下,让两个actor使用相同的PersistenceId应该是安全的。但鉴于上面引用的上述警告,这种方法在实践中是否有危险是否有任何理由?
答案 0 :(得分:1)
我可以想到一个场景,你会有两个独立的演员: 一个负责将持久性状态保存到数据库(即 调用Persist()),另一个调用来自的消息 手动请求时记录日志(即调用Recover())。该 读写操作将来自不同的演员。只有一个 曾经写过,只有一个人读过。但是,两者都需要相同 PersistenceId。
您需要的行为已经公开为Persistent Actors和Persistent Views。来自文档:
虽然可以使用持久性演员来制作和保持事件, 视图仅用于基于它们读取内部状态。像 持久化actor,一个视图有一个PersistenceId来指定一个集合 要重新发送到当前视图的事件。但是这个值应该是 与作为生产者的演员的PersistentId相关联 事件。
编辑:已更新,以提供有关如何在持久视图中访问事件的更多信息。
您可以通过覆盖Receive
的{{1}}方法从日记中加载。此方法的参数是一个对象,因此您需要将该对象强制转换为通过Persistent View
保留的任何事件。
Persistent Actor
方法还会处理您传递给视图的任何其他消息 - 例如来自表示层的读取请求。我通常在视图内部存储事件列表,并从这些事件中返回自定义视图模型。
Receive