知识卡片

聚合内强一致性,聚合间最终一致性:一次事务只改一个聚合

普通读书笔记卡

内容

DDD对一致性的处理原则是分层的:聚合内部采用数据强一致性,聚合之间则采用数据最终一致性。这背后有一条硬性约束——DDD强调一次事务最多只能修改一个聚合的数据,如果一次业务交易操作确实需要涉及多个聚合数据的修改,就不应该用跨聚合的分布式事务去强行保证实时一致,而应该采用领域事件驱动机制,通过数据最终一致性异步更新其余聚合的数据,以此实现聚合之间的解耦。相应地,聚合之间需要交互时也不应该在领域层内让聚合直接调用彼此,而应该把这种跨聚合的服务调用上升到应用层,由应用层的应用服务来组织和协调各个聚合的领域服务,这样可以避免在领域层这个核心业务逻辑所在的层次引入聚合间的耦合。这条原则把”哪里必须强一致、哪里可以接受最终一致”的边界,直接和”聚合边界”这个业务概念绑定在一起,给出了一条清晰、可操作的判断依据:只要操作还在同一个聚合内部,就该用事务保证强一致;一旦跨越了聚合边界,就该换成异步的最终一致性机制,而不是试图用分布式事务把强一致性硬撑过聚合边界。

参考来源

- 位置:第8章《聚合和聚合根:怎样设计聚合》"8.4 聚合的设计原则"(源文件:_epub-src/OEBPS/Text/chapter3-4-4.xhtml) - 结论依据:原文说明"在聚合内采用数据强一致性,在聚合之间采用数据最终一致性。这是因为DDD强调在一次事务中,最多只能修改一个聚合的数据。如果一次业务交易操作涉及了多个聚合数据的修改,那么应采用领域事件驱动机制,通过数据最终一致性异步更新所有聚合的数据,从而实现聚合解耦",直接支撑本卡片结论。 - 原始内容:在聚合内采用数据强一致性,在聚合之间采用数据最终一致性。这是因为DDD强调在一次事务中,最多只能修改一个聚合的数据。如果一次业务交易操作涉及了多个聚合数据的修改,那么应采用领域事件驱动机制,通过数据最终一致性异步更新所有聚合的数据。