EventSourcing 中的多聚合事务
Multi-Aggregate Transaction in EventSourcing
我是事件溯源的新手,但对于我们当前的项目,我认为它是一个非常有前途的选择,主要是因为审计跟踪。
我不是 100% 满意的一件事是缺少跨聚合的事务。请考虑以下问题:
我有一个 订单,它在不同工作站的不同机器上处理。我们有 容器,工人将 订单 放入其中,然后将其从一台机器运送到另一台机器。
必须通过容器(具有唯一的条形码-id)进行跟踪,订单本身无法识别。问题是:容器被重复使用并且需要被锁定,所以没有工人可以将两个订单放在同一个容器中 同时(为简单起见,假设他们无法查看容器内是否已经有订单)。
为清楚起见,高级视图:
- 订单已创建
- Order A put on Container 1
- 容器 1 移动到机器 A 并被扫描
- 机器A为订单A生成一些事件
- 将订单 A 从容器 1 移动到容器 2
- 订单 B 创建
- 订单 B 放上集装箱 1
...
"Move Order A from Container 1 to Container 2" 是我正在努力解决的问题。
这是交易中应该发生的事情(不存在):
- 容器 2:LockAquiredEvent
- 订单 A: PositionChangedEvent
- 容器 1:LockReleasedEvent
如果应用程序在位置 1 或位置 2 后崩溃,我们的容器已锁定且无法重复使用。
我有多种可能的解决方案,但我不确定是否有更优雅的解决方案:
- 假设它每周不会失败一次以上,并提供一种工作人员可以手动修复它的方法。
- 将容器跟踪视为不同的域,不要在该域中使用事件源。
- 用补偿行动和东西实现传奇。
还有什么我可以做的吗?
我认为 saga-thing 是要走的路,但我们会休息一下 api 我们得到命令 将订单 A 从容器 1 转移到容器 2 这意味着 API 命令处理程序需要侦听事件流并等待某个 saga 生成的事件将 200 传递给请求者。我不认为这是好的设计,是吗?
不使用事件源进行跟踪也不是完美的,因为容器可能会影响订单的质量,因此订单也必须跟踪使用过的容器。
感谢您的任何提示。
聚合之间的一致性是最终的,这意味着很可能是 AR1 改变了它的状态,Ar2 未能改变它的状态,现在你应该恢复 AR1 的状态以使系统进入一致状态。
1)如果这种情况经常发生并且恢复真的很痛苦,请重新调整您的 AR 边界。
2) 手动恢复。不要使用 saga,它们不应该用于此类目的。如果您的 saga 想要补偿 AR1 但其他事务已经将其状态更改为另一个,则补偿将失败。
我是事件溯源的新手,但对于我们当前的项目,我认为它是一个非常有前途的选择,主要是因为审计跟踪。
我不是 100% 满意的一件事是缺少跨聚合的事务。请考虑以下问题:
我有一个 订单,它在不同工作站的不同机器上处理。我们有 容器,工人将 订单 放入其中,然后将其从一台机器运送到另一台机器。
必须通过容器(具有唯一的条形码-id)进行跟踪,订单本身无法识别。问题是:容器被重复使用并且需要被锁定,所以没有工人可以将两个订单放在同一个容器中 同时(为简单起见,假设他们无法查看容器内是否已经有订单)。
为清楚起见,高级视图:
- 订单已创建
- Order A put on Container 1
- 容器 1 移动到机器 A 并被扫描
- 机器A为订单A生成一些事件
- 将订单 A 从容器 1 移动到容器 2
- 订单 B 创建
- 订单 B 放上集装箱 1 ...
"Move Order A from Container 1 to Container 2" 是我正在努力解决的问题。
这是交易中应该发生的事情(不存在):
- 容器 2:LockAquiredEvent
- 订单 A: PositionChangedEvent
- 容器 1:LockReleasedEvent
如果应用程序在位置 1 或位置 2 后崩溃,我们的容器已锁定且无法重复使用。
我有多种可能的解决方案,但我不确定是否有更优雅的解决方案:
- 假设它每周不会失败一次以上,并提供一种工作人员可以手动修复它的方法。
- 将容器跟踪视为不同的域,不要在该域中使用事件源。
- 用补偿行动和东西实现传奇。
还有什么我可以做的吗?
我认为 saga-thing 是要走的路,但我们会休息一下 api 我们得到命令 将订单 A 从容器 1 转移到容器 2 这意味着 API 命令处理程序需要侦听事件流并等待某个 saga 生成的事件将 200 传递给请求者。我不认为这是好的设计,是吗?
不使用事件源进行跟踪也不是完美的,因为容器可能会影响订单的质量,因此订单也必须跟踪使用过的容器。
感谢您的任何提示。
聚合之间的一致性是最终的,这意味着很可能是 AR1 改变了它的状态,Ar2 未能改变它的状态,现在你应该恢复 AR1 的状态以使系统进入一致状态。 1)如果这种情况经常发生并且恢复真的很痛苦,请重新调整您的 AR 边界。 2) 手动恢复。不要使用 saga,它们不应该用于此类目的。如果您的 saga 想要补偿 AR1 但其他事务已经将其状态更改为另一个,则补偿将失败。