.net - 在 WCF 应用程序中使用 MSMQ 消息时保留消息顺序

标签 .net wcf msmq

我有一个使用来自 MSMQ 队列的消息的应用程序。该应用程序使用 MSMQ 激活使用 AppFabric 在 IIS 中托管的 WCF 服务。

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

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

因此消息的顺序没有被保留。

我对如何处理应用程序错误的理解有误吗?

我是否可以设置绑定(bind)以保留消息顺序,在消息处理暂时失败的情况下也是如此?

最佳答案

皮特,

一些经验提示:

  • nieve 是正确的,你不应该依赖消息顺序 - 如果你有这种情况,那么第一条消息的成功执行应该触发下一条,它们不应该同时在队列中发送。
  • 对于大多数人来说,这似乎无关紧要,但有一天,它可能会变得如此——这个应用程序将如何扩展?如果有一天你发现自己被迫在队列的目的地放置多个 worker - 这将如何扩展到多台机器?由于无法并行执行消息,您的模型将失败。

  • 我强烈建议您调查 Saga Pattern ,这是此类问题的答案,由 NServiceBus 等产品提供和 MassTransit这两者都将消除您不得不直接管理 MSMQ 的困难,而这正是您一直在做的事情。

    我了解,在您的情况下,您可能根本没有选择,也无法“丢弃”您正在使用的模型,但是触发消息然后成功执行此消息(Saga)对您来说更有优势,然后您可以插入下一条消息。

    我希望这有帮助,

    关于.net - 在 WCF 应用程序中使用 MSMQ 消息时保留消息顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13030443/

    相关文章:

    c# - 具有大数据集的不完整 HttpWebResponse

    .net - .Net 中的程序集 DLL 管理

    C# 生成的代理方法与原始 Java 服务方法不同

    windows - Wix:安装 MSMQ 组件

    msmq - 我们可以在 MSMQ 中添加消息以供将来处理吗

    c# - 如何异步使用 HttpWebRequest (.NET)?

    json - WCF WebInvoke 方法 POST

    wcf - Autofac WCF - CloseChannel 在负载测试下被多次调用

    msmq - 访问消息队列系统被拒绝

    .net - 拍摄 ReplaySubject<T> 缓冲区的快照