【发布时间】:2012-11-22 18:37:34
【问题描述】:
假设您在有界上下文中有两个聚合,它们之间有一些约束。使用 DDD,这些聚合间约束不能在同一个事务中强制执行,即聚合边界是事务边界。
您会考虑使用 Microsoft CQRS 旅程中称为“流程管理器”的东西来协调同一限界上下文中的两个聚合,还是仅用于在两个限界上下文之间进行协调的流程管理器?在同一个有界上下文中协调两个或多个聚合根的进程管理器的等价物是什么?
【问题讨论】:
假设您在有界上下文中有两个聚合,它们之间有一些约束。使用 DDD,这些聚合间约束不能在同一个事务中强制执行,即聚合边界是事务边界。
您会考虑使用 Microsoft CQRS 旅程中称为“流程管理器”的东西来协调同一限界上下文中的两个聚合,还是仅用于在两个限界上下文之间进行协调的流程管理器?在同一个有界上下文中协调两个或多个聚合根的进程管理器的等价物是什么?
【问题讨论】:
默认情况下,聚合根定义了一个有界上下文,尽管它是一个较低级别的上下文(顺便说一句,您可以找到的最低级别的有界上下文是一个对象,任何对象)。进程管理器是他们使用的名称,而不是saga,可能你也可以想出其他名称,没关系,它们都有相同的目的。
是的,我会考虑使用 saga 来实现最终的一致性。事实上,我认为这是最好的方法,这正是我在自己的应用程序中所做的。无论如何,我使用的是消息驱动架构(是的,在本地、非分布式应用程序中)并且我通过服务总线(我自己的,尚未发布)自动支持 saga。
在处理最终一致性时,重要的是要确保无处不在的幂等性。也就是说,聚合根应该拒绝重复操作,当然事件处理程序应该能够处理同一事件可以多次发布的事实。但是请注意,您不能保证 100% 幂等性,但可以非常接近。
【讨论】: