如何解决事件溯源 - 重播事件
想象一个事件源系统,其中有一个消费服务订阅了某个事件 A。一旦这个消费者检测到事件 A 已经在网络中发出,它就会以某种方式处理它并调度自己的事件 B。
有人会如何重播这样的系统。在重放之前,事件 A 和事件 B 都存在于事件存储/数据库中。如果我们重放事件 A 和事件 B,这会不会重复计算事件 B 的调度(一次从 A 推导出,另一个从我们的事件存储中重放)?当 1 个事件可能导致其他已调度事件的级联链时,您通常如何重放事件。
解决方法
这并不是一种重放系统中事件的形式,以便再次发布每个事件并触发操作。它更像是从存储在事件存储区中的事件中补充(重构)聚合。
例如,实现可能涉及聚合的特定构造函数(或工厂方法),该聚合获取与特定聚合相关的已存储域事件列表。聚合不仅仅是应用这些事件来改变它自己的状态,直到达到聚合的当前状态。
您可以在 Vaughn Vernons 示例事件溯源和 CQRS 项目中查看这样的实现iddd_collaboration。我直接引用了 Forum Aggregate 的实现,该实现源自 Vaughn Vernon 对 EventSourcedRootEntity 的实现。
您可以查看论坛构造函数
public Forum(List<DomainEvent> anEventStream,int aStreamVersion) {
super(anEventStream,aStreamVersion);
}
以及不同when()方法的相关实现以及EventSourcedRootEntity的基类功能。
注意:如果在聚合补液期间存在大量事件和性能问题,那么查看 snapshots 的概念也可能是您的兴趣所在。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。