ala*_*udi 5 domain-driven-design event-driven-design cqrs event-sourcing
想象一个事件源系统,其中存在订阅某个事件 A 的消费服务。一旦该消费者检测到事件 A 已在网络中发出,它就会以某种方式处理它并调度自己的事件 B。
有人会如何重玩这样的系统。在重播之前,事件 A 和事件 B 都存在于事件存储/数据库中。如果我们重播事件 A 和事件 B,这是否会重复计算事件 B 的调度(一旦从 A 推导出来,另一个从我们的事件存储中重播)?当一个事件可能导致其他已调度事件的级联链时,通常如何重播事件。
它并不是真正重播系统中事件的一种形式,以便再次发布每个事件并触发操作。它更像是从存储在事件存储中的事件中重新水合(重构)聚合。
例如,实现可能涉及聚合的特定构造函数(或工厂方法),该构造函数获取与特定聚合相关的存储域事件的列表。聚合然后简单地应用这些事件来改变它自己的状态,直到达到聚合的当前状态。
您可以在 Vaughn Vernons 示例事件源和 CQRS 项目 iddd_collaboration中查看这样的实现。我直接引用了Forum Aggregate的实现,该实现源自 Vaughn Vernon 的EventSourcedRootEntity实现。
您可以查看论坛构造函数
public Forum(List<DomainEvent> anEventStream, int aStreamVersion) {
super(anEventStream, aStreamVersion);
}
Run Code Online (Sandbox Code Playgroud)
以及不同when()方法和EventSourcedRootEntity的基类功能的相关实现。
注意:如果在聚合补液期间存在大量事件并且性能问题是一个问题,那么您可能也会对研究快照的概念感兴趣。