C# 如何保证CQRS模式中消息的顺序
我在多线程环境中遇到了一个问题,即总线中消息的顺序可能无法保证,或者事件的处理可能无法在下一个到达之前完成 因此,ItemCreated消息可能发生在ItemChangedSomething消息之后,或者至少第一条消息没有被完全处理。这会导致“读取端”出现问题,因为我想更新(尚未)可用的数据 如何解决这个问题?(假设CQRS适用于域设计案例。)C# 如何保证CQRS模式中消息的顺序,c#,domain-driven-design,cqrs,C#,Domain Driven Design,Cqrs,我在多线程环境中遇到了一个问题,即总线中消息的顺序可能无法保证,或者事件的处理可能无法在下一个到达之前完成 因此,ItemCreated消息可能发生在ItemChangedSomething消息之后,或者至少第一条消息没有被完全处理。这会导致“读取端”出现问题,因为我想更新(尚未)可用的数据 如何解决这个问题?(假设CQRS适用于域设计案例。) 我是否必须创建一个传奇,或者是否有其他方法可以做到这一点?您应该选择一个消息传递基础结构,该基础结构可以保证按每个消费者的顺序传递事件,即使多个线程并行
我是否必须创建一个传奇,或者是否有其他方法可以做到这一点?您应该选择一个消息传递基础结构,该基础结构可以保证按每个消费者的顺序传递事件,即使多个线程并行地传递给不同的消费者。也就是说,如果您在发送端按顺序提供事件,消费者将按顺序接收它们 然后有两种基本方法来处理这种情况:
- 基础设施:在没有分布式数据存储的小型CQRS应用程序中,您可以为每个事件记录一个全局且不断增加的唯一id。然后确保消息传递体系结构按照事件id的顺序传递事件。这将完全消除无序事件传递。同样,您可以记录事件的时间戳,并按时间戳的顺序传递它们。虽然这可能会在某些情况下导致竞争条件,但对于大多数应用程序和用例,基于时间戳的排序是足够的(特别是,如果
和itemscreated
基于人工操作)itemschanged
- 状态机:对于较大的(通常是分布式的)设置,可以使用显式或隐式自动机/状态机模型来处理消息的无序到达。有了适当的消息传递基础结构,如果
和itemscreated
来自同一个流,您将永远不会收到无序的消息,但可能会发生来自两个不同来源(流/聚合根)的事件被某些投影或传奇以任意顺序使用的情况。因为这些事件是独立的,所以通常有一种方法(想想状态机)可以使投影保持在任一顺序的有效状态itemschanged