假设我们有一个生成两个事件的写入模型(域):
- 运营商添加(...)
- BusConnectionCreated(运营商,...)
Carrier 和 BusConnection 类是(部分)单独的聚合。BusConnection 分配给 Carrier 并包含其 CarrierId(单独的聚合仅由 id 引用)。
在正常的命令和事件流期间,写入模型和读取模型都很好,但是当我们想从头开始重建/添加新的读取模型时就会出现问题。
许多人建议(例如 akka-persistence 库)将事件按聚合存储在事件存储中。当非规范化器要求回复事件时,他从每个聚合中获得两个独立的事件流。问题是来自不同聚合的某些事件(如上面的示例)需要按照它们添加到事件存储的相同顺序进行回复。这意味着我们需要某种因果依赖/偏序。
最后是我的问题:
- 我应该重新考虑我的域设计(错误的聚合边界?)还是
- 我只需要强制执行部分排序吗?
如果是后者,那么最有效的方法是什么?
- 全球柜台?似乎没有可扩展性。
- 某种矢量时钟?
- 当它们出现时在反规范化器中检测到这些问题?例如,我们得到了 CarrierId,我们还没有具有此 ID 的 CarrierAdded 事件,所以我们将事件存储起来并首先等待预期的事件
- 在重放模式中处理事件方面引入一些顺序?例如,首先与运营商有关的所有事件,然后是与 BusConnection 相关的事件?