聚合必须是强一致的吗?

Posted

技术标签:

【中文标题】聚合必须是强一致的吗?【英文标题】:Do aggregates have to be strongly consistent? 【发布时间】:2013-01-27 14:56:06 【问题描述】:

我在 DDD 上阅读的所有内容都表明聚合中的状态必须是高度一致的。

这意味着如果需要冗余,则只能使用强一致性复制(例如 2PC、3PC 或 Paxos)。

是否允许使用最终一致的复制,如多主或主从?如果您确实使用了它们,那么在 DDD 术语中您仍然拥有“聚合”吗?这是常见的事情吗?

【问题讨论】:

【参考方案1】:

聚合本身需要保持一致,但是相关的聚合最终可以相互保持一致。事实上,最终一致性是分布式场景中 DDD 中的一种常见范式。可以将聚合视为一致性边界。这意味着聚合是根据必须一致的内容而不是对现实的纯粹反映来定义的。

例如,聚合上的行为可以发布域事件,然后将其发布到外部。该事件的带外处理程序最终可以使整个系统进入一致状态。很多时候,最终一致性是完全可以接受的业务约束,尤其是因为最终一致性在现实中更为普遍。

查看Effective Aggregate Design by Vaughn Vernon 了解更多信息。

更新

应根据具体情况评估聚合的最终一致性冗余。一些聚合将非常适合解决冲突,也许有自然的补偿行动。这些类型的冲突将以类似于 CQRS 风格的冲突的方式解决,其中需要采取补偿措施来使系统进入一致状态。与 CQRS 一样,应与领域专家讨论最终一致性的影响。

【讨论】:

您已经描述了 DDD 聚合的教科书定义,进一步证实了我问题中的介绍。但是,聚合冗余又如何呢?更具体地说:您如何处理在不同数据中心托管的冗余副本以满足地理定位需求? 诸如跨数据存储同步之类的任务应该由存储库或可能的服务处理(存储库是一种更标准的方法恕我直言)-域中的内容只是说明实体是什么的业务规则,并且它是如何转变的。

以上是关于聚合必须是强一致的吗?的主要内容,如果未能解决你的问题,请参考以下文章

面试官:ZooKeeper 是强一致的吗?

Python 是强类型的吗?

Flow学习笔记

CloudKit 是强一致还是最终一致?

持续可用与CAP理论 - 一个数据库系统开发者的观点

抽屉通知图标必须是白色的吗?