Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 在CQRS(事件源)中,事件存储中是否需要全局序列计数器?_Domain Driven Design_Cqrs - Fatal编程技术网

Domain driven design 在CQRS(事件源)中,事件存储中是否需要全局序列计数器?

Domain driven design 在CQRS(事件源)中,事件存储中是否需要全局序列计数器?,domain-driven-design,cqrs,Domain Driven Design,Cqrs,在尝试了解CQR(以及通常的DDD)时,我遇到了两种情况,即两个事件发生在不同的聚合上,但它们的顺序具有领域意义。如果是这样的话,它们可能发生得太近,以至于时间戳(如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为事件发生的顺序存在歧义 例如,域可以触发一个应用于Customer聚合的CustomerCreatedEvent,然后在Agent聚合上触发一个CustomerAssignedToAgent事件。如果CustomerSignedToAgent事件发

在尝试了解CQR(以及通常的DDD)时,我遇到了两种情况,即两个事件发生在不同的聚合上,但它们的顺序具有领域意义。如果是这样的话,它们可能发生得太近,以至于时间戳(如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为事件发生的顺序存在歧义

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


那么,我只是做得很糟糕吗?是否曾经有过这样一种情况,即跨不同集合的事件顺序很重要?或者,您应该在事件存储中保留一个全局序列号,以便能够识别事件发生的确切顺序

一般来说,执行全球秩序是个坏主意。聚合意味着形成酸性语义边界

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

在您的情况下,在创建CustomerCreatedEvent的同时,Customer应该向AgentAggregate发送一条消息,告诉它分配自己。一般来说,聚合间通信应该通过消息传递完成。

我也在domaindrivendesign yahoo列表中找到:

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

无法保证处理程序之间或聚合之间的顺序

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


谢谢Szymon,我认为这是最有可能的情况!我已经读了很多次了,但是。。。当您使用EventStore作为队列来使用来自其他有界上下文的事件时,或者甚至对于生成这些事件的同一BC,您如何确保将它们按顺序排列?您不需要按照非常严格的顺序使用它们,但您至少需要能够从给定的偏移量使用它们。