在WCF应用程序中消费MSMQ消息时保留消息顺序

4
我有一个应用程序,它从MSMQ队列中消费消息。该应用程序使用在IIS中托管的AppFabric中的WCF服务的MSMQ激活。
保留消息顺序至关重要,但是MSMQ是否保证消息顺序被保留?
如果我的应用程序无法处理消息(例如由于与数据库的连接断开),则似乎该消息将被移动到重试队列。这使得应用程序可以从主队列接收新消息,直到原始消息从重试队列移回主队列。在一定数量的重试间隔后,消息将被移动到毒丸队列。但是,如果应用程序处理新消息,则毒丸队列处理就不是选项。
因此,消息的顺序未被保留。
我对应用程序错误处理方式的理解有误吗?
我能否设置绑定以便在消息处理暂时失败的情况下也保留消息顺序?

1
我不太确定你为什么想要实现这个。使用消息队列的想法是,如果某些东西失败了,它不会停止任何其他命令/消息处理。如果我理解正确,你想做的恰恰相反(当发生故障时停止消息处理,直到它被解决),对吗?否则,任何后续的失败都将按正确顺序堆叠在失败队列中,以便在问题得到解决后立即重试。 - nieve
1个回答

3

Pete,

根据经验给你一些小提示:

  1. nieve 的观点是正确的,你不应该依赖于消息顺序。如果你有这样的情况发生,则第一条消息成功执行后应触发下一个,而不应同时将它们全部发送到队列中。
  2. 对大多数人来说,这似乎与他们无关,但有一天,这可能会变得相关。如果有一天你发现自己被迫在队列目标上放置多个工作程序,那么如何扩展这个应用程序? 你的模型将因为无法并行执行消息而失败。

我强烈建议你调查一下Saga Pattern,这是这种类型问题的答案。像NServiceBusMassTransit等产品提供了这个功能,可以消除你现在必须直接管理 MSMQ 的困难。

我明白在你的情况下,你可能没有选择,不能“丢弃”你正在使用的模型,然而触发一个消息,然后在成功执行此消息(Saga)后,再插入下一个消息,这将更有利于你。

希望这些提示能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接