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