事件溯源 - 流设计

Event Sourcing - stream design

我坐在这里研究 CQRS 和事件溯源,这些话题非常有趣。当谈到流设计和聚合根时,我觉得有点不知所措。你是怎么做到的?

假设我有一个 UI,我可以在其中将东西添加到篮子中,在篮子中生成一条线。

我会:

  1. 一个流媒体公关篮(附有基本信息,如送货详情、姓名、电子邮件等)
  2. 一个流 pr basketline

所以我会有很多流

基本上我只通过网络发送最少的数据。

或者我只需要一个流

  1. stream/basket-[篮子编号]

每次我在我的篮子里加一条线时,我都会把整个篮子通过电线发送出去。

据我了解,最好是一对多的流,而不是一个大的 streams/basket 流。还是我也弄错了?

我的重点是流。关于这种设计的任何“最佳实践”:链接、书籍等都将被应用。

How do you do it?

首先观看 All Our Aggregates are Wrong(Mauro Servienti,2019 年),它考虑了您可能需要多少 不同 聚合来表示数字购物车的问题。


我倾向于将聚合视为信息图 - 如果两条信息必须一起改变(A 改变,因此 B 也必须立即改变;或者 A 不能改变,因为它的允许值范围受B)约束,则属于同一个聚合。聚合的边界将紧密耦合在一起的信息与其他所有信息分开。

因为分布式事务很难,所以我们希望我们的聚合以这样一种方式存储,即更改聚合只需要持有一个锁。例如,我们通常不会将聚合的单个实例分布在多个数据库中,因为确保所有数据库在“同一”时间以完全正确的方式更改真的很难。

出于完全相同的原因,我们通常将所有紧密耦合在一起的信息存储在一个事件流中:只需要管理一个锁。