事件溯源和 sagas - 补偿交易

Event-sourcing and sagas - compensating transactions

关于 SO 的第一个问题(真的吗???),所以请耐心等待 :)

我们正在构建一个使用事件溯源的解决方案。我们的一些业务流程会很长 运行,因此我们计划使用 sagas 将命令编排到 多个聚合根 .

据我了解,如果 saga 发出的命令失败,则 saga 将负责向所有先前调用的聚合根。

如果聚合根的状态在外部发生突变(即由其他process/user)之后应该采取什么行动 它参与了 saga,但是 before saga 失败并且 向该聚合根发出补偿命令?

换句话说,如何尝试补偿某个聚合根的事件流(用 EventStore 术语)中的 不是最后一个 的事件?

这是一个相当棘手的情况,因为我所看到的是,在您的补偿条目之后,您可能会得到无效的 AR ,从而使您的补偿操作无效。

您可能需要重新审视流程的设计,以便在您确定流程管理器 (saga) 能够完成之前不会对 AR 进行更改。也许暂时存储值以供以后更改。

另一种方法可能是阻止您的 AR 上的某些命令,如果它处于某种状态,表明它可能会导致这些命令出现问题。然后用户将无法发出这些命令。您的流程经理会处理 那个 状态和任何状态 expiries/timeouts 等等。