如何在恢复期间拒绝快照?
How do I reject a snapshot during recovery?
我目前正在尝试使用 Akka Persistence 为事件源应用程序实现快照。我在这里尝试采用的策略是:
- 每 X 个事件保存一个快照
- 在我的状态对象上维护一个
schemaVersion
属性。 schemaVersion
的目的是允许我 evolve/migrate 如果我改变我回复事件的方式,我的状态。
- 在恢复期间,如果我收到
state.schemaVersion
低于我当前架构版本的 SnapshotOffer,则丢弃该快照并从头重播事件
- 恢复完成后删除早于我的最新有效快照的所有快照
但是,我发现我无法在恢复期间丢弃快照。如果快照存储中有快照,则不会向我提供更早的事件。
我很难理解应该如何处理这个问题。这里的正确方法是什么?
有一件事我不明白,状态对象是什么?它从哪里得到 schemaVersion
? state 不正是从快照/事件重建的你的 actor 的状态吗?
在任何情况下,您都不能删除 and/or 提供的快照。相反,您可以执行以下操作:
- 添加配置
drop-snapshot
(默认为false
)
在 preStart
override def preStart(): Unit = {
super.preStart()
if (dropSnapshot) deleteSnapshots(SnapshotSelectionCriteria.Latest)
}
覆盖recovery
方法
override def recovery = {
if (dropSnapshot) {
Recovery(fromSnapshot = SnapshotSelectionCriteria.None)
} else {
Recovery(fromSnapshot = SnapshotSelectionCriteria.Latest)
}
}
我目前正在尝试使用 Akka Persistence 为事件源应用程序实现快照。我在这里尝试采用的策略是:
- 每 X 个事件保存一个快照
- 在我的状态对象上维护一个
schemaVersion
属性。schemaVersion
的目的是允许我 evolve/migrate 如果我改变我回复事件的方式,我的状态。 - 在恢复期间,如果我收到
state.schemaVersion
低于我当前架构版本的 SnapshotOffer,则丢弃该快照并从头重播事件 - 恢复完成后删除早于我的最新有效快照的所有快照
但是,我发现我无法在恢复期间丢弃快照。如果快照存储中有快照,则不会向我提供更早的事件。
我很难理解应该如何处理这个问题。这里的正确方法是什么?
有一件事我不明白,状态对象是什么?它从哪里得到 schemaVersion
? state 不正是从快照/事件重建的你的 actor 的状态吗?
在任何情况下,您都不能删除 and/or 提供的快照。相反,您可以执行以下操作:
- 添加配置
drop-snapshot
(默认为false
) 在
preStart
override def preStart(): Unit = { super.preStart() if (dropSnapshot) deleteSnapshots(SnapshotSelectionCriteria.Latest) }
覆盖
recovery
方法override def recovery = { if (dropSnapshot) { Recovery(fromSnapshot = SnapshotSelectionCriteria.None) } else { Recovery(fromSnapshot = SnapshotSelectionCriteria.Latest) } }