知识卡片

设计小聚合:大聚合导致并发冲突与重构代价

普通读书笔记卡

内容

聚合设计的第一条原则是”在一致性边界内建模真正的不变条件”:聚合是用来封装真正的业务不变性的,而不是简单地把一堆对象凑在一起,聚合边界之外的任何东西都与该聚合无关,这也是聚合能实现业务高内聚、并且能作为拆分微服务的最小业务单元的原因(但除非非常必要,不建议按聚合把微服务拆得过细)。第二条原则是”设计小聚合”:如果聚合设计得过大,会因为包含过多实体和值对象,导致实体间管理复杂、领域逻辑实现复杂,在高频操作场景下容易出现并发冲突或数据库锁,最终拖累系统可用性;相反,小聚合能降低”业务变化时被迫对聚合做大规模重构”的概率,让领域模型更能适应业务变化。这两条原则合起来给出一个判断依据:聚合的边界该划多大,不是看”逻辑上这些东西是不是都相关”,而是要反过来问”这个边界里包的东西,是否真的是一组必须绑在一起保证强一致性的核心不变条件”——凡是不属于这组核心不变条件的内容,即使业务上有点关联,也应该被排除在聚合边界之外,用更小、更聚焦的聚合来换取并发性能和面对业务变化时的韧性。

参考来源

- 位置:第8章《聚合和聚合根:怎样设计聚合》"8.4 聚合的设计原则"(源文件:_epub-src/OEBPS/Text/chapter3-4-4.xhtml) - 结论依据:原文说明"聚合是用来封装真正的业务不变性的,而不是简单地将对象组合在一起……如果聚合设计得过大,聚合会因为包含过多的实体和值对象,导致实体之间的管理过于复杂,以及领域逻辑实现复杂,在高频操作时就可能会出现并发冲突或者数据库锁,最终导致系统可用性变差。小聚合设计可以降低由于业务过大,在业务变化时导致聚合重构的可能性",直接支撑本卡片结论。 - 原始内容:如果聚合设计得过大,聚合会因为包含过多的实体和值对象,导致实体之间的管理过于复杂,以及领域逻辑实现复杂,在高频操作时就可能会出现并发冲突或者数据库锁,最终导致系统可用性变差。