繁体   English   中英

如何确保CQRS模式中的消息顺序

[英]How to ensure the order of messages in CQRS pattern

我和Greg Young的示例应用程序有点混淆,并且在多线程环境中偶然发现问题,即总线中的消息顺序可能无法保证,或者事件的处理可能在下一次到达之前未完成。

因此,ItemCreated消息可能发生在ItemChangedSomething消息之后,或者至少第一条消息未完全处理。 这导致“读取侧”出现问题,因为我想更新尚未(尚)可用的数据。

如何解决这个问题? (假设CQRS适合域设计案例。)

我是否必须创建一个Saga或者还有其他方法吗?

您应该选择一个消息传递基础结构,以确保按消费者按顺序传递事件,即使多个线程并行传递给不同的消费者。 即,如果您在发送方按顺序提供事件,消费者将按顺序接收它们。

然后有两种基本方法来处理这种情况:

  • 基础设施 :在没有分布式数据存储的小型CQRS应用程序中,您可以为每个事件记录全局且不断增加的唯一ID。 然后确保事件由消息传递体系结构按其id的顺序传递。 这将完全消除无序事件传递。 同样,您可以记录事件的时间戳,并按照时间戳的顺序交付。 虽然这可能会导致某些情况下的竞争条件,但对于大多数应用程序和用例,基于时间戳的排序就足够了(特别是,如果ItemCreatedItemChanged基于人为操作)。

  • 状态机 :对于较大(通常是分布式)的设置,您可以使用显式或隐式自动机/状态机模型来应对消息的无序到达。 使用适当的消息传递基础结构,如果它们来自同一个流,您将永远不会ItemCreated接收ItemCreatedItemChanged ,但是可能会发生来自两个不同源(流/聚合根)的事件被某些投影或传奇任意使用订购。 由于这些事件是独立的,因此通常有一种方法(想想状态机)将投影保持在任一订单的有效状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM