【问题标题】:Eventual consistency across aggregate roots in the same bounded context using a process manager aka saga使用流程管理器(又名 saga)在同一有界上下文中跨聚合根的最终一致性
【发布时间】:2012-11-22 18:37:34
【问题描述】:

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

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

【问题讨论】:

    标签: domain-driven-design cqrs


    【解决方案1】:

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

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

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

    【讨论】:

    • +1。很好的答案。我不会说 AR 本身就定义了 BC,但我完全同意其他一切。
    • 这是一个很好的答案,但夸大了一点。只是为了澄清一下:有界上下文是 模型 边界,而不是聚合或对象边界(参见DDD Reference 的第 8 页。将聚合和对象与有界上下文混为一谈过于简化。其中的模型有界上下文通常由多个聚合组成。
    • 对象和聚合根(作为聚合的外观)都为 some 模型定义了明确的边界。每个 BC 只是一组较小的 BC。我知道当说 BC 时,它是关于更高级别的 BC,但即使是低级对象也匹配有界上下文定义。这只是证明了 DDD 的概念即使在对象级别也是合理的。也许这就是为什么有些人说 DDD 只是 OOP 做得对。
    • Saga 是一个协调器,如果您将聚合视为有界上下文,那么您将拥有订单、运输、付款。然后您将创建一个 saga,它协调在电子商务网站上销售商品的过程。想象一下,您的流程是下订单、付款、发货。现在,如果您可以在不付款的情况下向 VIP 客户发货,并让他们在 60 天后付款,会发生什么?如果 VIP 是有超过 10 个订单的人,明天 Vip 是 Visa Gold cald 持有人,以后 Vip 客户的收货地址在 vip 国家列表中怎么办?你会从 3 个有界上下文中获取所有数据到 saga 中吗?
    • 感谢您指出,即使是域、聚合或日常对象,在某个范围内都是有界上下文。那是我需要的验证。但正如@DmitriBodiu 所说,如果可能的话,我也赞成编舞。不过也谢谢你的回答
    猜你喜欢
    • 2023-04-06
    • 2014-08-22
    • 1970-01-01
    • 2016-07-11
    • 2019-11-18
    • 2023-04-03
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多