首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件存储根聚合与聚合

事件存储根聚合与聚合
EN

Stack Overflow用户
提问于 2017-01-28 19:41:23
回答 2查看 3.2K关注 0票数 8

事件存储中的“根聚合”和“聚合”有什么区别?

即使经过几个小时的搜索,我也很难准确地定义这些。我的理解是,聚合是一个ID表,它将存储中的事件(集合)组合在一起,通常使用对象表示形式,这就是为什么也可以存在聚合类型。

此外,我还看到了带有版本号的聚合表,在这样的前提下,它们本质上是表示事件集合的组/容器/聚合I,这让我感到困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-29 10:02:48

因此,我们已经同意,您正在尝试将事件流创建到DDD、聚合根和聚合模式。

有一个共同的模式,即每个聚合都有自己的流。它具有聚合根的名称和标识,尽管名称部分不是必需的。

整个聚合上的所有操作都由事件表示,然后事件被写入到这个流中。

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

流: MyName

  • space.Order-123
  • OrderPlaced
  • OrderDeliveryAddressSet
  • OrderLineAdded
  • OrderLineAdded
  • OrderLineRemoved
  • OrderConfirmed
  • OrderETASet
  • OrderPaid
  • OrderDispatched
  • OrderDelivered

实体的概念不表示在事件存储端,因为您不能轻松地定义不同流之间的关系,以便从多个流中读取事件,从而重新组合聚合。因此,所有事件都在聚合根流中写入和读取,然后聚合根流成为整个聚合的流。

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

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

关于“桌子”,我不太明白你的意思。当然,您可以在表中对事件存储进行建模,这样做有不同的策略。通常情况下,你会更喜欢使用专门的事件存储,比如这一个

票数 9
EN

Stack Overflow用户

发布于 2017-01-29 05:44:50

DDD的书和术语没有具体提到事件来源(它还不是一件事)。

SE电台播客226与埃里克·埃文斯略为介绍了这一点。

聚合是一组相关实体和值对象,这些实体和值对象在集合中对需要保持内部一致性的单个事物(或相关的一组事物)进行建模。

聚合根可以是一个查看聚合“通过”的根实体(例如,您拥有它的发票实体和一组单独的订单行)

不幸的是(但命名很难),人们感到有必要使术语聚合过载,以也指在流中执行事件聚合的事物(尽管相关事件集确实一起表示聚合的状态)。

在“实现DDD”一书中,Functional附录很好地将此区分开来--我倾向于将这件事(为创建目的而聚合的相关事件的聚合)称为“折叠状态”(并且将此折叠状态的演化与实际决策分离开来)。

预测(在DDD-CQRS-ES术语中)是指挂在事件之外的一组抽象的事物,这些事情对新事件做出了适当的反应(代表人们已经做出的决定)。投影可以维护非规范化视图,ala您的‘摘要’(不止一个)。溪流有事件。决策过程将对这些事件进行折叠,以推断出相关的背景,以便作出决定。投影可以具有状态(由与流(或其集合)相关的事件子集的有序观察构建)--它可能是一个blob,它保存在键值存储中,可以方便地查询。它可能是每个流的内存总量,您可以通过每次从一开始读取来构建它。它可能是一个类似的内存缓存,由某种形式的检查点(最后一个事件之一看到)支持,以及一个序列化的形式。可能是其中的很多。或者在退化的情况下,你可能还没有任何连接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41914040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档