EventSourcing 中的多聚合事务

Multi-Aggregate Transaction in EventSourcing

我是事件溯源的新手,但对于我们当前的项目,我认为它是一个非常有前途的选择,主要是因为审计跟踪。

我不是 100% 满意的一件事是缺少跨聚合的事务。请考虑以下问题:

我有一个 订单,它在不同工作站的不同机器上处理。我们有 容器,工人将 订单 放入其中,然后将其从一台机器运送到另一台机器。

必须通过容器(具有唯一的条形码-id)进行跟踪,订单本身无法识别。问题是:容器被重复使用并且需要被锁定,所以没有工人可以将两个订单放在同一个容器中 同时(为简单起见,假设他们无法查看容器内是否已经有订单)。

为清楚起见,高级视图:

"Move Order A from Container 1 to Container 2" 是我正在努力解决的问题。

这是交易中应该发生的事情(不存在):

  1. 容器 2:LockAquiredEvent
  2. 订单 A: PositionChangedEvent
  3. 容器 1:LockReleasedEvent

如果应用程序在位置 1 或位置 2 后崩溃,我们的容器已锁定且无法重复使用。

我有多种可能的解决方案,但我不确定是否有更优雅的解决方案:

还有什么我可以做的吗?

我认为 saga-thing 是要走的路,但我们会休息一下 api 我们得到命令 将订单 A 从容器 1 转移到容器 2 这意味着 API 命令处理程序需要侦听事件流并等待某个 saga 生成的事件将 200 传递给请求者。我不认为这是好的设计,是吗?

不使用事件源进行跟踪也不是完美的,因为容器可能会影响订单的质量,因此订单也必须跟踪使用过的容器。

感谢您的任何提示。

聚合之间的一致性是最终的,这意味着很可能是 AR1 改变了它的状态,Ar2 未能改变它的状态,现在你应该恢复 AR1 的状态以使系统进入一致状态。 1)如果这种情况经常发生并且恢复真的很痛苦,请重新调整您的 AR 边界。 2) 手动恢复。不要使用 saga,它们不应该用于此类目的。如果您的 saga 想要补偿 AR1 但其他事务已经将其状态更改为另一个,则补偿将失败。