使用流程管理器aka saga在相同的有界上下文中跨聚合根的最终一致性

Tin*_*ino 7 domain-driven-design cqrs

假设你在有界上下文中有两个聚合,它们之间有一些约束.使用DDD,这些集合间约束不能在同一事务中强制执行,即聚合边界是事务边界.

您是否会考虑使用Microsoft CQRS之旅中的内容称为"进程管理器"来协调同一有界上下文中的两个聚合,还是仅用于在两个有界上下文之间进行协调的进程管理器?在同一有界上下文中协调两个或多个聚合根的过程管理器的等价物是什么?

Mik*_*eSW 9

默认情况下,聚合根定义有界上下文,尽管是较低级别的上下文(顺便提一下,您可以找到的最低级别有界上下文是对象,任何对象).流程管理器是他们使用的名称而不是传奇,可能你也可以提出其他名称,没关系,它们都有相同的目的.

是的,我会考虑使用一个传奇来实现最终的一致性.事实上,我认为这是最好的方式,这正是我在自己的应用程序中所做的.无论如何,我正在使用消息驱动的架构(是的,在本地的非分布式应用程序中),我通过服务总线(我自己的,尚未发布)自动支持saga.

在处理最终一致性时,重要的是确保各处的幂等性.也就是说,聚合根应该拒绝重复操作,当然事件处理程序应该能够处理同一事件可以多次发布的事实.但是,请注意,您无法保证100%的幂等性,但您可以非常接近.

  • 这是一个很好的答案,但夸大了一点.只是为了澄清:有界上下文是_model_边界,而不是聚合或对象边界(参见[DDD参考]第8页(http://domainlanguage.com/ddd/patterns/DDD_Reference_2011-01-31.pdf)将聚合和对象与有界上下文混淆是过于简化的.有界上下文中的模型通常由多个聚合组成. (2认同)
  • 对象和聚合根(作为聚合的外观)都定义了*some*model的显式边界.每个BC只是一组较小的BC.我知道,当说BC时,它是关于BC的更高级别,但即使是低级对象也与有界上下文定义相匹配.这证明了DDD的概念即使在对象层面也是合理的.也许这就是为什么有人说DDD只是OOP做得对. (2认同)