【发布时间】:2015-12-14 18:49:16
【问题描述】:
首先,让我声明我是命令查询职责分离和事件溯源(消息驱动架构)的新手,但我已经看到了一些显着的设计优势。但是,还有一些我不清楚的问题。
假设我有一个 Customer 类(聚合根),其中包含一个名为 postalAddress 的属性(Address 类的一个实例,它是一个值对象)。我还有一个Order 类(另一个聚合根),它包含(在OrderItem 对象和其他东西中)一个名为deliveryAddress 的属性(也是Address 类的一个实例)和一个名为status 的字符串属性.
客户通过发出PlaceOrder 命令下订单,该命令触发OrderReceived 事件。此时订单状态为"RECEIVED"。订单发货时,仓库有人发出ShipOrder 命令,触发OrderShipped 事件。此时订单状态为"SHIPPED"。
其中一个业务规则是,如果Customer 在订单发货之前更新了他们的postalAddress(即状态仍为"RECEIVED"),则Order 对象的deliveryAddress 也应该被更新。如果Order 的状态已经是"SHIPPED",则deliveryAddress 将不会更新。
问题 1. 将这个“有条件级联地址更新”放在 Saga(又名流程管理器)中的最佳位置是什么?我假设是这样,因为它正在翻译一个事件(“The客户刚刚更新了他们的邮政地址...") 到一个命令 ("... 所以更新订单 123 的送货地址")。
问题 2。如果 Saga 是该工作的正确工具,它如何识别属于用户的订单,因为聚合只能通过它的唯一 ID(在我的例子中是 UUID )?
继续说,鉴于每个聚合代表一个事务边界,如果系统要在 更新Customer 的postalAddress (CustomerAddressUpdated 事件持续到事件存储),但之前 OrderDeliveryAddressUpdated 可以更新(即在两个事务之间),然后系统处于不一致状态。
问题 3。如何检测和纠正这种“违反”一致性规则的行为?
【问题讨论】:
标签: domain-driven-design cqrs event-sourcing referential-integrity aggregateroot