Domain driven design 域事件与事件源和CQR的因果关系
假设我们有一个写入模型(域),它生成两个事件:Domain driven design 域事件与事件源和CQR的因果关系,domain-driven-design,cqrs,event-sourcing,causality,akka-persistence,Domain Driven Design,Cqrs,Event Sourcing,Causality,Akka Persistence,假设我们有一个写入模型(域),它生成两个事件: 载体添加(…) 总线连接已创建(运营商,…) 载体和母线连接类别是(部分)单独的集合。总线连接被分配给一个载体并包含其载体id(单独的聚合仅由id引用) 在正常的命令和事件流中,写模型和读模型中的一切都很好,但是当我们想要从头开始重建/添加新的读模型时,问题就会出现 许多人建议(例如akka持久性库)事件存储在事件存储中的每个聚合中。当反规范化程序要求回复事件时,他从每个聚合中获得两个独立的事件流。问题是,来自不同聚合的一些事件(如上面的示例)
- 载体添加(…)
- 总线连接已创建(运营商,…)
- 我是否应该重新思考我的领域设计(糟糕的聚合边界?)
- 我是否只需要强制执行偏序李>
- 全球计数器?似乎没有可扩展性
- 某种向量钟李>
- 当这些问题出现时,是否在反规范化器中检测它们?例如,我们获得了CarrierId,但还没有具有此id的CarrierAdded事件,因此我们将该事件隐藏起来,并首先等待预期的事件
- 在重播模式下处理事件时引入一些顺序?例如,首先是与运营商有关的所有事件,然后是与总线连接相关的事件
如果您确实需要向外扩展,并且两个事件可能在同一毫秒内出现,那么您确实需要在处理程序中检测问题并使用非规范化。这听起来比实际困难,因为它可以很容易地用一个非常简单的状态机实现。乔纳森·奥利弗(Jonathan Oliver)在这部传奇故事中有过类似的经历,但这一原则也适用于此。为了打破紧密的联系,关于事件和命令的“因果关系计数器”怎么样?本质上,这是一种在副作用树中衡量命令/事件“深度”的方法,其根源是在第0步启动级联的任何外部/计划/用户触发命令。当您有两个具有相同时间戳的项时,通常可以先处理具有较低计数器的项,即使它们实际上彼此没有关联。是的,这也可以工作(但我认为这可能很难实现或给开发人员带来一些负担)。