7

在试图了解 CQRS(以及一般的 DDD)时,我遇到了两个事件发生在不同聚合上但它们的顺序具有领域意义的情况。如果是这样,那么它们可能发生得如此紧密,以至于时间戳(正如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为顺序存在歧义其中发生的事件。

例如,域可以触发一个CustomerCreatedEvent应用于Customer聚合的事件,然后在聚合上触发一个CustomerAssignedToAgent事件Agent。如果事件发生在 之前,则该CustomerAssignedToAgent事件没有意义CustomerCreatedEvent,但通常这两者都可能由于一个操作而被触发,这使得时间戳可能实际上是相同的。

那么我只是在建模不好吗?是否应该存在跨不同聚合的事件顺序很重要的情况?或者您应该在事件存储中保留一个全局序列号,以便您可以识别事件发生的确切顺序?

4

2 回答 2

10

我还在domaindrivendesign yahoo 列表中找到了 Greg Young 的这篇文章:

只有在聚合根边界内的每个处理程序才能保证订单。

处理程序之间或聚合之间没有顺序保证。

试图提供这些东西会导致阴暗面。

于 2010-06-03T08:57:52.633 回答
8

一般来说,强制执行全球秩序是个坏主意。聚合旨在形成 ACID 语义边界。

这意味着不应在一个事务中更新两个聚合,并且没有其他方法可以强制执行全局顺序。

在您的情况下,与创建 CustomerCreatedEvent 一起,客户应该向代理聚合发送一条消息,告诉它分配自己。通常,聚合之间的通信应该通过消息传递来完成。

于 2010-06-02T11:29:56.930 回答