【问题标题】:Out of order messages possible with transactional queues in MSMQ?MSMQ 中的事务队列可能出现乱序消息?
【发布时间】:2010-12-12 17:34:22
【问题描述】:

我是消息传递的新手,有点不清楚 MSMQ 是否可以为事务队列传递乱序消息。我想这一定是因为如果一条消息没有被正确处理(并且因为我们将使用多个“竞争消费者”),那么当失败的消息被放回队列时,其他消费者可以继续处理消息。只是似乎无法在任何地方找到黑白答案。

【问题讨论】:

    标签: msmq


    【解决方案1】:

    是否需要按顺序处理您的消息,因为:

    1) 它们是工作流的不同步骤吗?如果是这样,您应该创建不同的队列来处理不同的步骤。进程 1 读取队列 1,执行其操作,然后写入队列 2,依此类推。

    2) 他们有不同的优先级?如果优先级相当粗略(优先级中消息的顺序无关紧要),您应该创建高优先级和低优先级队列。消费者首先从更高优先级的队列中读取。

    3) 业务规则指定它。例如,“客户订单必须按照收到的顺序进行处理”。消息队列不适合这种排序,因为它们只传达接收消息的顺序。定期轮询数据库以获取有序任务列表的进程会更合适。

    【讨论】:

    • 没有。 3 是最接近的匹配。我将使用消息来构建数据的非规范化视图以进行报告,但我还将跟踪域事件之间的更改以启用同步(需要存储差异)。所以,排序很重要。有很多视图,在高峰时间每个视图都可能没有大量更新,所以我想将负载分散到多个消费者身上。希望这是有道理的
    【解决方案2】:
    • 很难找到否定的黑白答案(它们并不经常存在)。
    • 您在这里混淆了两个术语(我认为)。传递是从发件人到队列。消费是从队列到消费者。这两个动作不能放在同一个事务中。它们是完全独立的动作(这是排队的要点之一)

    更重要的是:来自“Microsoft Message Queuing Services (MSMQ) Tips

    这些消息要么按照发送顺序一起发送,要么根本不发送。此外,从同一台机器发起到同一队列的连续事务将按照它们提交的相对顺序到达。

    这是 msmq 中唯一的 order 情况。

    遗憾的是,您找不到任何关于有序消费的信息,因为它不相关。您可以随意使用来自 msmq 的消息。

    更新:如果您必须订购处理,那么我看不出使用许多消费者的理由。您必须在代码中实现该顺序。

    【讨论】:

    • 感谢您的链接。是的,对我来说还是有点模糊。当我有多个竞争消费者从队列中读取并且我必须按顺序处理消息时,Esp 不确定是否需要实现“Resequencer”
    • 消费消息的部分排序如何?如果消息属于“对话”,如何在不单线程处理消费者的情况下按部分顺序处理它们?
    猜你喜欢
    • 2012-05-20
    • 2011-05-01
    • 2012-12-24
    • 2018-02-20
    • 2012-03-27
    • 2012-11-14
    • 1970-01-01
    • 2013-06-28
    • 2020-02-17
    相关资源
    最近更新 更多