【问题标题】:Messaging - dealing with out-of-order messages in an at-least once messaging system消息传递 - 在至少一次消息传递系统中处理乱序消息
【发布时间】:2015-04-23 04:44:58
【问题描述】:

我目前正致力于实现一个基于消息传递的系统(也酌情使用混合 DDD、CQRS、事件溯源等)。使用的一般模式是使用重复数据删除消费者/幂等接收者的至少一次消息传递。

一个症结是乱序消息。 Vaughn Vernon 在他的书Implementing Domain Driven Design(第 13 章,大致从 p475 开始)中提倡的一种方法是使用 MemberChangeTracker,它检查消息的日期并采取相应的行为(给出的示例是禁用消息到达 after 一条启用消息,尽管是首先生成的。更改跟踪器检查发生的日期,如果发生的日期在最后收到的事件之后,则仅应用第二条进入的消息(禁用消息)。

这很混乱。补偿行为很困难,组合可能会很快爆发。 Vaughn 的回答很“简单”:不要对外部系统中的数据负责,这是有道理的。但是,如果您确实需要这样做,是否有更好的方法?

我的问题是:每个消费者是否可以从给定的聚合订阅每个事件,跟踪消息顺序(所以每个事件都会有一个消息顺序号:Creation = 1;UpdateToAggregate = 2;Cancel = 3 ) 并只过滤它感兴趣的那些?这样做会让消费者看到它收到的 Enable 消息有问题,并等到它收到“丢失”消息(在这种情况下,Disable,或者它可能只是它甚至不感兴趣的消息)?这将允许消费者按顺序应用消息并显着简化其处理程序逻辑。

这是一种有效的方法吗?这里有什么权衡(例如延迟消息处理等待按顺序消息到达)?这似乎是合乎逻辑的——尽管有点不舒服,因为每个消费者都必须订阅 每条 消息,而不是好的——方法。这实用吗?

【问题讨论】:

  • 你的问题让我很困惑。什么是“消费者”以及他们订阅的事件是什么?领域事件,如果它们在您的聚合之外?或者聚合通过您的事件存储来的更改事件?无论如何,一个事件处理程序只处理一种类型的事件,为什么会有问题?版本在聚合级别上强制执行,这几乎是强制性的。

标签: .net domain-driven-design messaging cqrs event-sourcing


【解决方案1】:

当您使用聚合时,每个消费者都必须在快照之后从消息流或从快照 + 消息流构建聚合。因此,如果消息太多,您不必遍历特定聚合的所有消息。除此之外,我看不出还有什么方法可以让您在跳过其他部分的同时理解某些部分的消息。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多