由于我没有看到使用AKKA.NET Journals and Snapshot store的任何示例,我假设我必须使用这两种类型的actor来实现事件存储和CQRS。
每次更改actor状态时,是否希望更新Snapshot存储,或者应该每隔10秒设置一次计划更新?
Snapshot存储演员是否应该只与Journal演员交谈,那么拥有该州的演员不应该同时与Journals和Snapshot交谈?我正在思考SOC。
假设我必须关闭服务器并进行备份。用户尝试通过Web UI访问产品(如计算机)。那时,演员系统中不存在产品演员。要检索产品的状态,我不应该转到快照存储而不是运行所有日志以重新创建状态吗?
答案 0 :(得分:7)
在Akka.Persistence中,Journal和SnapshotStore实际上是用于从特定持久性提供者中抽象出actor的actor。您几乎永远不必直接使用它们 - PersistentView
和PersistentActor
在引擎盖下自动使用它们。
快照存储是优化演员恢复速度的唯一方法,以防持久性演员有一系列要从中恢复的事件。 在分布式环境中,没有事件源的快照不是实现持久性的手段。好主意是拥有一个计数器,它在持久化actor处理X事件后产生快照。基于时间的更新毫无意义 - 在许多情况下,演员可能在指定时间内没有改变。性能也差(很多不必要的周期)。
SnapshotStores和Journals彼此不了解。 Akka.Persistence持久性actor具有内置的恢复机制,可以处理来自SnapshtoStores和Journals的actor的状态恢复,并公开与它们通信的方法。
正如我所说,您可能不希望直接与快照商店和期刊进行通信。这是持久性actor /持久性视图的用途。你可能只是直接从后端存储中读取actor状态,但是如果在最新保存的快照之后没有其他事件,你应该进行比较。在不同的工作节点上重新创建持久的actor / view是IMO更好的解决方案。