事件存储根聚合与聚合

web*_*ish 6 aggregate cqrs event-sourcing event-store

事件存储中的"根聚合"和"聚合"之间有什么区别?

即使经过数小时的搜索,我也无法准确定义这些内容.我的理解是聚合是一个ID表,它将商店内的事件(集合)组合在一起,通常使用对象表示,这也是聚合类型的原因.

另外,我已经看到了带有版本号的聚合表,我发现它们本质上是表示事件集合的组/容器/聚合ID,这让我感到困惑.

Ale*_*rev 7

因此,我们同意您尝试将事件流设置为DDD Aggregate Root和Aggregate模式.

有一种常见的模式,即每个聚合都有自己的流.它具有聚合根的名称和标识,但名称部分不是必需的.

整个聚合上的所有操作都由事件表示,然后将事件写入此流.

因此,如果您有一个MyNamespace.Order具有多个子值对象或实体的聚合根,则MyNamespace.OrderLine所有行上的操作都是通过访问聚合根方法完成的,并且所有事件都写入一个流,因此对于ID为123的订单,它将是:

流:MyName

  • space.Order-123
  • 订单已下
  • OrderDeliveryAddressSet
  • OrderLineAdded
  • OrderLineAdded
  • OrderLineRemoved
  • 订单已确认
  • OrderETASet
  • OrderPaid
  • OrderDispatched
  • OrderDelivered

实体的概念没有在事件存储方面表示,因为您无法轻松定义不同流之间的关系以从多个流中读取事件以重构聚合.因此,所有事件都在聚合根流中写入和读取,然后聚合根流成为整个聚合流.

关于聚合的一个重要规则是聚合也是一致性边界.这基本上意味着聚合上的所有操作必须在一个事务中完成.

保持事件版本以处理并发非常重要.当您从事件存储中读取聚合时,您也会获得最新的事件版本.执行操作后,您将写回新事件,检查最新事件版本是否仍然相同.如果最后一个事件版本不匹配,则抛出并发异常,因为有人已经更改了聚合并在您发生冲突之前将更改写入了存储.

关于"表格",我不太清楚你的意思.当然,您可以在表格中对事件存储进行建模,并且在执行此操作时有不同的策略.更常见的是,你不喜欢使用专门的事件存储,就像这个.

  • 好的总结:一个小问题:当一个人发生冲突时,冲突解决的一般概念就会出现 - 在某些情况下,人们可能希望/能够定义关于如何/是否会调整一组事件以考虑干预的规则事件和/或一个人可以使用幂等写入来允许多个作者在第一个之后获得相同的结论,即使他们没有_实际射击熊,也能默默地获得对他们的写作的成功响应.在协作域中管理此类并发的能力是适当使用ES的关键力量/典型代表 (2认同)