Domain driven design 事件源-重播事件

Domain driven design 事件源-重播事件,domain-driven-design,cqrs,event-sourcing,event-driven-design,Domain Driven Design,Cqrs,Event Sourcing,Event Driven Design,想象一个事件源系统,其中存在订阅某个事件a的消费服务。一旦该消费服务检测到网络中发出了事件a,它就会以某种方式处理它并发送自己的事件B 有人会如何重放这样一个系统。在重播之前,事件存储/数据库中同时存在事件A和事件B。如果我们重播事件A和事件B,这是否会重复计算事件B的调度(一次从A推断,另一次从我们的事件存储重播)?当一个事件可能导致其他已调度事件的级联链时,通常如何重放事件。这不是在系统中重放事件的一种形式,因此每个事件都会再次发布并触发操作。它更像是从存储在事件存储中的事件重新水化(重组)

想象一个事件源系统,其中存在订阅某个事件a的消费服务。一旦该消费服务检测到网络中发出了事件a,它就会以某种方式处理它并发送自己的事件B


有人会如何重放这样一个系统。在重播之前,事件存储/数据库中同时存在事件A和事件B。如果我们重播事件A和事件B,这是否会重复计算事件B的调度(一次从A推断,另一次从我们的事件存储重播)?当一个事件可能导致其他已调度事件的级联链时,通常如何重放事件。

这不是在系统中重放事件的一种形式,因此每个事件都会再次发布并触发操作。它更像是从存储在事件存储中的事件重新水化(重组)聚合

例如,实现可能涉及一个聚合的特定构造函数(或工厂方法),该方法获取与特定聚合相关的存储域事件列表。聚合而不是简单地应用那些事件来改变它自己的状态,直到达到聚合的当前状态

您可以在Vaughn Vernons示例事件源和CQRS项目中查看这种实现。我直接引用了一个论坛聚合的实现,它是从Vaughn Vernon的

您可以查看论坛构造器

公共论坛(列出一个EventStream,int Astream版本){
超级版(anEventStream、aStreamVersion);
}
以及不同when()方法的相关实现和EventSourceDrootenty的基类功能

注意:如果有大量事件和性能问题是聚合补液过程中的一个问题,那么您可能也会感兴趣。思考一下重放事件的原因,答案就会显现出来。是为某个特定的消费者,因为它错过了他们?将事件直接交付给该消费者(而不是其他所有人)。开发人员是否需要实时观察系统的行为,因为他们需要调试某些东西?在系统的一个单独的回滚实例上执行此操作。没有真正的用例要求您实际全局重播所有事件,而目标重播避免了您描述的问题(尽管具有幂等性是很好的)。