Domain driven design 在CQRS(事件源)中,事件存储中是否需要全局序列计数器?
在尝试了解CQR(以及通常的DDD)时,我遇到了两种情况,即两个事件发生在不同的聚合上,但它们的顺序具有领域意义。如果是这样的话,它们可能发生得太近,以至于时间戳(如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为事件发生的顺序存在歧义 例如,域可以触发一个应用于Domain driven design 在CQRS(事件源)中,事件存储中是否需要全局序列计数器?,domain-driven-design,cqrs,Domain Driven Design,Cqrs,在尝试了解CQR(以及通常的DDD)时,我遇到了两种情况,即两个事件发生在不同的聚合上,但它们的顺序具有领域意义。如果是这样的话,它们可能发生得太近,以至于时间戳(如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为事件发生的顺序存在歧义 例如,域可以触发一个应用于Customer聚合的CustomerCreatedEvent,然后在Agent聚合上触发一个CustomerAssignedToAgent事件。如果CustomerSignedToAgent事件发
Customer
聚合的CustomerCreatedEvent
,然后在Agent
聚合上触发一个CustomerAssignedToAgent
事件。如果CustomerSignedToAgent
事件发生在CustomerCreatedEvent
之前,则该事件没有意义,但通常这两个事件都可能由于一个操作而触发,这使得时间戳可能实际上是相同的
那么,我只是做得很糟糕吗?是否曾经有过这样一种情况,即跨不同集合的事件顺序很重要?或者,您应该在事件存储中保留一个全局序列号,以便能够识别事件发生的确切顺序 一般来说,执行全球秩序是个坏主意。聚合意味着形成酸性语义边界 这意味着不应在一个事务中更新两个聚合,并且没有其他强制执行全局顺序的方法 在您的情况下,在创建CustomerCreatedEvent的同时,Customer应该向AgentAggregate发送一条消息,告诉它分配自己。一般来说,聚合间通信应该通过消息传递完成。我也在domaindrivendesign yahoo列表中找到: 只有在聚合根边界内的每个处理程序才能保证顺序 无法保证处理程序之间或聚合之间的顺序 试图提供这些东西会导致黑暗面
谢谢Szymon,我认为这是最有可能的情况!我已经读了很多次了,但是。。。当您使用EventStore作为队列来使用来自其他有界上下文的事件时,或者甚至对于生成这些事件的同一BC,您如何确保将它们按顺序排列?您不需要按照非常严格的顺序使用它们,但您至少需要能够从给定的偏移量使用它们。