跨越聚合边界的交易

时间:2015-07-04 06:44:11

标签: transactions domain-driven-design domain-model aggregateroot

我有以下域建模问题,我似乎最终要么跨越一致性边界或创建一个巨大的聚合。有人可以帮我分解吗?

有两种工作类型JobAJobBJobA由任务TaskA组成。 JobB由任务TaskB组成。 JobAJobB无关。它们之间唯一共同点是它们都需要设备资源。我本来想创建5个可能互相引用的聚合根 - JobA将引用TaskA等等。

Domain model

我可以将一份工作及其任务集中在一起。这是以引入其他开销为代价的,因为任务本身就是复杂的生物。但是,以下约束阻止我使用任何一种模型。

  1. 如果任何任务仍未完成,则无法将作业标记为完成。此检查会导致事务跨越聚合边界(例如,TaskAJobA)。
  2. 无法将设备分配到1个以上的作业。此检查将跨越两个作业聚合。
  3. 必须先释放设备,然后才能将作业标记为完成。此交易将跨设备和工作总量。
  4. 拥有单个聚合会将所有交易放在边界内,但这会使聚合不可能大。是否有一个不同的模型隐藏在所有这些我缺少的?

2 个答案:

答案 0 :(得分:1)

我认为最好的解决方案可能是使用最终的一致性。

当我对设计agreggates有疑问时,我总是看看Effective Agreggate Design by Vaughn Vernon

答案 1 :(得分:0)

我知道这个问题已经过时了,但我没有看到您绘制的架构和一致性要求有任何问题:

  1. 作业必须有一个包含状态的任务列表。当任务在其自己的事务中完成时,它会发送TaskCompleted事件/消息,然后Job选择它并在内部更新任务状态。这样,Job无需检查任务agregate即可知道所有任务是否已完成。

  2. 必须对设备集合执行设备分配。这将生成将由Job聚合使用的EquipmentAssignedToJob事件/消息,以使用此作业正在使用此设备的信息更新其自身状态。如果使用或不使用,设备将知道它自己的状态。

  3. 作业完成操作将释放设备。从作业中释放设备生成可由设备和设备状态消耗的JobFinishedUsingEquipment事件/消息将更新为未使用。