EventSourcing中的多聚合交易

问题描述 投票:2回答:1

我对事件外包不熟悉,但是对于我们当前的项目,我认为它是一个非常有前途的选择,主要是因为审计跟踪。

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

我有一个order,可以在不同站点的各种机器上进行处理。我们有containers,工人将order放入其中并在机器之间搬运。

跟踪必须通过containers(具有唯一的条形码ID)完成,order本身无法识别。问题是:containers被重用并且需要被锁定,所以没有工人可以同时在同一个container中放置两个orders(为简单起见,假设他们不能看看容器内是否已经有订单)。

为清晰起见,请从高层次查看:

  • [Order已创建
  • [Order放在容器1上的物品
  • Container 1移动到机器A并被扫描
  • 机器A为订单A生成一些事件
  • 订单 A从容器 1移到容器 2
  • [Order B已创建
  • [Order B放在Container 1...

“将Order A从Container 1移到Container 2”是我正在努力解决的问题。

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

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

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

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

  • 假设它每周不会失败超过一次,并提供一种工人可以手动修复它的方法。
  • 将容器跟踪视为另一个域,不要在该域中使用事件源。
  • 用补偿动作和​​物品来实现传奇。

还有其他我能做的吗?

我认为是明智的选择,但是我们将有一个REST API,我们可以在其中获得命令从容器1到2的转移订单A,这意味着API命令处理程序将需要侦听事件流,并等待一些传奇生成的事件将200发送给请求者。我认为这不是好的设计,是吗?

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

谢谢您的提示。

domain-driven-design event-sourcing saga
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.