- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,让我声明我是命令查询职责分离和事件溯源(消息驱动架构)的新手,但我已经看到了一些重要的设计优势。但是,仍然有一些问题我不清楚。
假设我有一个 Customer
包含名为 postalAddress
的属性的类(聚合根) (Address
类的一个实例,它是一个值对象)。我也有一个 Order
包含(在 OrderItem
对象和其他事物中)一个名为 deliveryAddress
的属性的类(另一个聚合根) (也是 Address
类的一个实例)和一个名为 status
的字符串属性.
客户通过发出 PlaceOrder
下订单命令,触发 OrderReceived
事件。此时订单状态为"RECEIVED"
.订单发货时,仓库有人发出ShipOrder
命令,触发 OrderShipped
事件。此时订单状态为"SHIPPED"
.
业务规则之一是,如果 Customer
更新他们的 postalAddress
在订单发货之前(即状态仍然是 "RECEIVED"
), deliveryAddress
的Order
对象也应该更新。如果状态为Order
已经"SHIPPED"
, deliveryAddress
不会更新。
问题 1. 将这种“有条件的级联地址更新”放在 Saga(又名流程管理器)中的最佳位置是什么? 我假设是这样,因为它正在将一个事件(“客户刚刚更新了他们的邮政地址......”)转换为一个命令(“......所以更新订单 123 的送货地址”)。
问题 2. 如果 Saga 是该工作的正确工具,鉴于只能通过其唯一 ID(在我的情况下为 UUID)检索聚合,它如何识别属于用户的订单?
继续,假设每个聚合代表一个事务边界,如果系统崩溃 后 Customer
的 postalAddress
已更新(CustomerAddressUpdated
事件被持久化到事件存储)但 之前 OrderDeliveryAddressUpdated
可以更新(即,在两个事务之间),然后系统处于不一致的状态。
问题 3. 如何检测并纠正此类“违反”一致性规则的行为?
最佳答案
在大多数情况下,订单的交货地址应该独立于任何其他数据更改,因为客户可能希望将订单发送到任意地址。话虽如此,我将就如何解决这个问题给出我的 2c:
Is the best place to handle this in a process manager?
OrderProcess
.
How would one get hold of the correct
OrderProcess
instance given that it can only be retrieve by aggregate id?
IKeyStore
将任意键关联到 AR Id 的机制。因此,您将能够关联类似
[order-process]:customerId=CID-123;
的内容。作为某些聚合的关键。
How are such "violations" of consistency rules detected and rectified?
关于domain-driven-design - 在事件溯源中如何处理一致性违规?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34257897/
我是一名优秀的程序员,十分优秀!