【问题标题】:How do I reject a snapshot during recovery?如何在恢复期间拒绝快照?
【发布时间】:2017-09-21 19:40:47
【问题描述】:

我目前正在尝试使用 Akka Persistence 为事件源应用程序实现快照。我在这里尝试采取的策略是:

  • 每 X 个事件保存一个快照
  • 在我的状态对象上维护schemaVersion 属性。 schemaVersion 的目的是让我能够在我改变回复事件的方式时发展/迁移我的状态。
  • 在恢复期间,如果我收到一个 SnapshotOffer,其 state.schemaVersion 小于我当前的架构版本,则丢弃该快照并从头开始重播事件
  • 在恢复完成后删除所有早于我最新有效快照的快照

但是,我发现在恢复期间我无法丢弃快照。如果快照存储中有快照,则不会向我提供更早的事件。

我很难了解应该如何处理这个问题。这里的正确方法是什么?

【问题讨论】:

  • 我真的不确定这是否可能如所述。您可能必须通过在恢复期间设置“拒绝”标志来解决此问题,丢弃所有恢复数据,然后在启动后进行重写和重播,当您有更多的灵活性时......
  • 我很惊讶没有更多的人谈论这个。当然,不断变化的状态一定是事件溯源的关注点之一,对吧?
  • 当然,但这不是通常的处理方式。通常,人们使用具有向前兼容的序列化格式的 Persistence,这对模式演变很友好。我一直在改进我的架构,但我从不拒绝旧的事件或快照——我只是确保新架构能够智能地处理旧数据......
  • 这是 99% 我预计这将如何工作。但是,我想确保有办法从不兼容的快照状态中恢复;例如如果日志重放逻辑中存在导致错误状态的错误怎么办?
  • 在这种情况下,我怀疑您会退回到我上面的建议:您设置了“拒绝”标志,并在恢复后手动重播。这是一个极端情况,我认为必须这样对待。

标签: scala akka akka-persistence


【解决方案1】:

有一件事我不明白,什么是状态对象?从哪里得到schemaVersion?状态不正是从快照/事件中重建的 Actor 的状态吗?

在任何情况下,您都不能删除和/或跳过提供的快照。相反,您可以执行以下操作:

  1. 添加配置drop-snapshot(默认为false
  2. preStart

    覆盖 def preStart(): Unit = { super.preStart() if (dropSnapshot) deleteSnapshots(SnapshotSelectionCriteria.Latest) }
  3. 覆盖recovery 方法

    覆盖定义恢复 = { if (dropSnapshot) { 恢复(fromSnapshot = SnapshotSelectionCriteria.None) } 别的 { 恢复(fromSnapshot = SnapshotSelectionCriteria.Latest) } }

【讨论】:

  • state 对象是演员的内部状态,我通过回放事件来构建它。嗯。使用配置并不是一个坏主意。我不希望它只是一个布尔值,因为在我下一次部署时,我可能希望从快照中恢复。
  • 但是,我可以根据配置文件中的时间戳或其他内容来确定是否删除快照。
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 2017-11-09
  • 2023-03-27
  • 2019-06-21
  • 2019-09-17
  • 1970-01-01
  • 2015-07-07
  • 2015-11-22
相关资源
最近更新 更多