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