【发布时间】:2013-04-27 02:09:04
【问题描述】:
我是 CQRS 和最终一致性模型的新手,如果这是一个愚蠢的问题,请原谅我。
鉴于我刚刚开始,我在内存中有一个本地 CommandBus 和 EventPublisher。我的事件被持久化到 RavenDB 数据库用于重播,但是事件被发布并且处理程序在本地调用(不是通过 NServiceBus 等在外部排队)。 EventPublisher 确实以异步方式发布事件(例如 Task.Factory.StartNew)。
有时我的事件有依赖关系(例如,必须先将 OrderReceived 事件处理到 ReadModel 中,然后才能将 OrderShipmentStatusUpdated 事件正确处理到 ReadModel 中)。
我该如何处理这种情况?使用传奇?如何在如上所述的简单内存模型中使用 Sagas? “推迟”一个事件是否被认为是可以接受的(也许将其标记为推迟并简单地尝试“偶尔”重新处理所有推迟的事件)?
有哪些应对策略?
谢谢。
【问题讨论】:
-
您有什么理由异步发布事件?如果事件是同步发布的,那么事件的顺序不会有问题,最终的一致性也不会有问题,因为它们将与命令在同一个线程中运行。
-
性能。除非我在所有 Web 请求中同步并且只有 1 个服务器,否则我仍然会遇到问题,不是吗?
-
@Jeff:我认为 Sarmaad 的意思是 OrderReceived 和 OrderShipmentStatusUpdated 应该同步处理。
-
您如何建议使用内存中的事件发布者这样做?创建在后台处理的单线程队列?
标签: cqrs event-sourcing eventual-consistency