【发布时间】:2017-09-21 19:40:47
【问题描述】:
我目前正在尝试使用 Akka Persistence 为事件源应用程序实现快照。我在这里尝试采取的策略是:
- 每 X 个事件保存一个快照
- 在我的状态对象上维护
schemaVersion属性。schemaVersion的目的是让我能够在我改变回复事件的方式时发展/迁移我的状态。 - 在恢复期间,如果我收到一个 SnapshotOffer,其
state.schemaVersion小于我当前的架构版本,则丢弃该快照并从头开始重播事件 - 在恢复完成后删除所有早于我最新有效快照的快照
但是,我发现在恢复期间我无法丢弃快照。如果快照存储中有快照,则不会向我提供更早的事件。
我很难了解应该如何处理这个问题。这里的正确方法是什么?
【问题讨论】:
-
我真的不确定这是否可能如所述。您可能必须通过在恢复期间设置“拒绝”标志来解决此问题,丢弃所有恢复数据,然后在启动后进行重写和重播,当您有更多的灵活性时......
-
我很惊讶没有更多的人谈论这个。当然,不断变化的状态一定是事件溯源的关注点之一,对吧?
-
当然,但这不是通常的处理方式。通常,人们使用具有向前兼容的序列化格式的 Persistence,这对模式演变很友好。我一直在改进我的架构,但我从不拒绝旧的事件或快照——我只是确保新架构能够智能地处理旧数据......
-
这是 99% 我预计这将如何工作。但是,我想确保有办法从不兼容的快照状态中恢复;例如如果日志重放逻辑中存在导致错误状态的错误怎么办?
-
在这种情况下,我怀疑您会退回到我上面的建议:您设置了“拒绝”标志,并在恢复后手动重播。这是一个极端情况,我认为必须这样对待。
标签: scala akka akka-persistence