在CQRS(事件溯源)中,事件存储中需要一个全局序列计数器吗?

7
在尝试理解CQRS(和DDD)时,我遇到过这样的情况:在不同的聚合上发生了两个事件,但它们的顺序具有领域意义。如果是这样的话,它们可能会非常接近地发生,以至于时间戳(如我所见到的示例实现中使用的)无法区分它们,这意味着事件存储不包含领域的“完整”表示,因为事件发生的顺序存在歧义。
例如,领域可以触发一个适用于“客户”聚合的“CustomerCreatedEvent”,然后是一个适用于“代理商”聚合的“CustomerAssignedToAgent”事件。如果“CustomerAssignedToAgent”事件在“CustomerCreatedEvent”之前发生,则没有意义,但通常这两个事件可能是由一个操作触发的,这使得时间戳几乎相同。
那么我只是在错误地建模吗?是否应该出现跨不同聚合的事件序列很重要的情况?还是应该在事件存储中保留全局序列号,以便您可以确定事件发生的确切顺序?
2个回答

10

我还在domaindrivendesign的雅虎列表上找到了Greg Young的这篇帖子:

仅在聚合根边界内的处理程序内才能保证顺序。

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

试图提供这些东西会导致走向黑暗面。


8

总的来说,强制全局顺序是一个不好的想法。聚合体旨在形成ACID语义边界。

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

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


谢谢Szymon,我也认为那是最有可能的情况! - Jon M
我已经多次阅读了相同的内容,但是...当您将EventStore用作队列以从其他有界上下文中消耗事件,甚至用于生成它们的同一BC时,如何确保按顺序获取它们?您不需要非常严格的顺序,但您至少需要能够从给定偏移量消费它们。 - Papipo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接