2012-10-23 49 views
3

我有一个应用程序使用MSMQ队列中的消息。应用程序使用AppFabric在IIS中使用MSMQ激活托管在IIS中的WCF服务。在WCF应用程序中使用MSMQ消息时保留消息顺序

消息顺序保存至关重要。但MSMQ保证消息顺序是否被保留?

在我看来,如果我的应用程序无法处理消息,例如由于连接到数据库的连接断开,消息将被移至重试队列。这允许应用程序从主队列接收新消息,直到原始消息从重试队列移回主队列。经过一定数量的重试间隔后,该消息将移至毒性队列。但是如果应用程序处理新消息,那么毒化队列处理根本就不是一种选择。

因此消息的顺序尚未保存。

我的理解错误是如何处理的?

我可以设置绑定,以便在消息处理暂时失败的情况下保留消息顺序吗?

+0

[与netMSMQbinding有序传递]的可能重复(http://stackoverflow.com/questions/729612/ordered-delivery-with-netmsmqbinding) –

+1

真的不知道为什么你希望为了达成这个。使用消息队列的想法是,如果失败,它不会停止任何其他命令/消息处理。如果我正确地理解了你,你只想做与此相反的事情(当发生故障时停止消息处理直到它被排序),是吗?否则,任何后续故障将按照正确的顺序堆叠在故障队列中,以便在问题排序后尽快重试。 – nieve

回答

3

皮特,

从经验中的一些技巧:

  1. Nieve酒店是正确的,你不应该依赖于消息顺序 - 如果你有这样的情况,则第一条消息的succesfull执行应触发接下来,他们不应该全部在队列中同时发送。
  2. 对于大多数人来说,这似乎并不相关,但有一天,它可能会变成这样 - 这个应用程序将如何扩展?如果有一天你发现自己被迫将多个工人放在队列的目的地 - 这将如何扩展到多台机器?由于无法并行执行消息,因此您的模型将失败。

我强烈建议你调查Saga Pattern,这是应对这种类型的问题,它是由产品,如NServiceBusMassTransit提供这都将除去具有难度,直接您是管理MSMQ停滞不前。

我明白,在你的情况下,你可能根本没有选择,也不能“抛弃”你正在使用的模型,但是,触发一条消息然后成功执行这条消息对你来说会更有优势(佐贺),你可以插入下一条消息。

我希望这有助于