我在 DDD 上阅读的所有内容都暗示聚合中的状态必须是高度一致的。
这意味着如果需要冗余,则只能使用强一致性复制(例如 2PC、3PC 或 Paxos)。
您是否允许使用最终一致的复制,例如多主或主从?如果您确实使用了它们,那么在 DDD 术语中您仍然拥有“聚合”吗?这是常见的事情吗?
我在 DDD 上阅读的所有内容都暗示聚合中的状态必须是高度一致的。
这意味着如果需要冗余,则只能使用强一致性复制(例如 2PC、3PC 或 Paxos)。
您是否允许使用最终一致的复制,例如多主或主从?如果您确实使用了它们,那么在 DDD 术语中您仍然拥有“聚合”吗?这是常见的事情吗?
聚合本身需要是一致的,但是相关的聚合最终可以相互一致。事实上,最终一致性是分布式场景中 DDD 的一种常见范式。可以将聚合视为一致性边界。这意味着聚合是根据必须一致的内容而不是对现实的纯粹反映来定义的。
例如,聚合上的行为可以发布域事件,然后将其发布到外部。该事件的带外处理程序最终可以使整个系统进入一致状态。很多时候,最终一致性是完全可以接受的业务约束,特别是因为最终一致性在现实中更为普遍。
查看Vaughn Vernon 的 Effective Aggregate Design了解更多信息。
更新
最终一致的聚合冗余应根据具体情况进行评估。一些聚合将非常适合解决冲突,也许有自然的补偿行动。这些类型的冲突将以类似于 CQRS 风格的冲突的方式解决,其中需要采取补偿措施来使系统进入一致状态。与 CQRS 一样,应与领域专家讨论最终一致性的影响。