【发布时间】:2020-09-07 09:53:57
【问题描述】:
我正在阅读由 Scott Millett 使用 Nike Tune 撰写的《域驱动设计的模式、原则和实践》一书。在第 19 章“聚合”中,他指出:
有时在一个事务中修改多个聚合实际上是一种很好的做法。但它是 重要的是要首先了解这些指南存在的原因,以便您了解 忽视它们的后果。
当最终一致性的成本太高时,考虑在同一个事务中修改两个对象是可以接受的。例外情况通常是企业告诉您客户体验太不令人满意。
总而言之,每个事务保存一个聚合是默认方法。但是你应该 与业务协作,评估每个用例的技术复杂性,并有意识地忽略 如果存在有价值的优势(例如更好的用户体验),则为指南。
我在我的项目中遇到一个案例,当用户请求对我的应用程序进行操作并且该操作影响两个聚合,并且必须通过两个聚合验证操作才能成功执行规则。 类似于“为被拘留者分配牢房”:
- 用户提出请求
- 从数据库中获取被拘留者 (AR1) 并接收命令:detainee.AllocateTo(cellId); 3 Cell(AR2)被抓取并接收命令:cell.Allocate(detaineeId);
第 2 步和第 3 步都可能引发异常,具体取决于被拘留者的状态和牢房容量。但是把它抽象出来。
使用最终一致性,如果步骤 2 执行成功,发出事件 DetaineeAllocated,但步骤 3 失败(将在另一个事务中运行,在事件处理程序内),聚合的状态将不一致,更糟糕的是,操作似乎为用户成功执行。
我知道有类似“当用户购买超过$ 100,其类型必须更改为VIP”的情况可以使用最终一致性来实现,但我提到的情况似乎不是一个。
你认为这是书中提到的一个特例吗?
【问题讨论】:
标签: domain-driven-design eventual-consistency