我可以使用相同的PersistenceId从单独的actor中读/写吗?

时间:2016-08-29 15:49:09

标签: akka.net akka.net-persistence

Petabridge blog's Akka.Persistence intro表明您不能拥有多个具有相同PersistenceId的角色:

  

PersistenceId字段很重要 - 它使用Akka.Persistence唯一标识一个持久化状态的实体,并且在任何给定时间应该只有一个持久化actor用于单个PersistenceId。< / p>      

[...]所以想象一下,如果你有两个具有相同PersistenceId但序列号不同的actor写入同一个商店。这将是混乱并且将不可避免地出错 - 所以这就是为什么每个PersistenceId在你的ActorSystem中是全局唯一的至关重要(至少对于写入该商店的所有演员来说都是如此。)

我可以想到一个场景,你将有两个独立的actor:一个负责将持久性状态保存到数据库(即调用Persist()),另一个用于在手动请求时重放来自日志的消息这样做(即调用Recover())。读写操作将来自不同的参与者。只有一个人写过,只有一个人读过。但是,两者都需要相同的PersistenceId。

我相信在这种情况下,让两个actor使用相同的PersistenceId应该是安全的。但鉴于上面引用的上述警告,这种方法在实践中是否有危险是否有任何理由?

1 个答案:

答案 0 :(得分:1)

  

我可以想到一个场景,你会有两个独立的演员:   一个负责将持久性状态保存到数据库(即   调用Persist()),另一个调用来自的消息   手动请求时记录日志(即调用Recover())。该   读写操作将来自不同的演员。只有一个   曾经写过,只有一个人读过。但是,两者都需要相同   PersistenceId。

您需要的行为已经公开为Persistent ActorsPersistent Views。来自文档:

  

虽然可以使用持久性演员来制作和保持事件,   视图仅用于基于它们读取内部状态。像   持久化actor,一个视图有一个PersistenceId来指定一个集合   要重新发送到当前视图的事件。但是这个值应该是   与作为生产者的演员的PersistentId相关联   事件。

编辑:已更新,以提供有关如何在持久视图中访问事件的更多信息。

您可以通过覆盖Receive的{​​{1}}方法从日记中加载。此方法的参数是一个对象,因此您需要将该对象强制转换为通过Persistent View保留的任何事件。

Persistent Actor方法还会处理您传递给视图的任何其他消息 - 例如来自表示层的读取请求。我通常在视图内部存储事件列表,并从这些事件中返回自定义视图模型。

Receive