MSMQ 单(队列)对多(侦听器)方案

Posted

技术标签:

【中文标题】MSMQ 单(队列)对多(侦听器)方案【英文标题】:MSMQ one (queue) to many (listeners) scenario 【发布时间】:2011-09-15 15:02:45 【问题描述】:

我有这种情况:一个客户端将消息发送到 msmq 队列实例,并且有 3 个进程在侦听此队列。我希望能够让这些实例中的每一个选择不同的消息并对其进行处理。

我知道这是队列的常见使用场景,我已经有了使用 MSMQ、.NET 和 C# 的工作代码。

但是我想知道 msmq 是否是我最好的选择 - 文档明确指出 MSMQ 用于“一对一”通信,这意味着不应该有多个侦听器。

这让我想知道,我正在为我的用例做正确的解决方案吗?还是反过来,我是否必须为每个侦听器创建一个队列并将消息分发到工作流的前面部分?

非常感谢提供一个演示 MSMQ 在此类场景中使用的工作示例的链接。

谢谢

【问题讨论】:

【参考方案1】:

听起来你需要一个服务总线 - 但是,它们往往有点重量级,所以它可能有点矫枉过正。使用服务总线,您可以设置发布-订阅方案,其中任意数量的侦听器都可以订阅消息。 NServiceBus 是一个使用起来有点简单的服务总线(它是建立在 MSMQ 之上的);它有一个免费版本,限制为每秒 30 条消息。 Rhino ESB也号称轻量级。

【讨论】:

【参考方案2】:

据我了解,您正在使用多个侦听器来执行负载平衡等操作。这是一个绝对有效的场景,它通常用于集群环境或单个侦听器无法消费所有传入消息的负载平衡场景。顺便提一句。群集 BizTalk 以相同的方式使用 MSMQ 消息。

一对一是指将一条消息传递给一个侦听器,但这并不意味着每个队列只能有一个侦听器。如果所有侦听器都进行相同的处理,并且不依赖于哪个侦听器来选择消息,那么它仍然是一对一的。

也可以使用一个队列将一条消息传递给多个侦听器。不建议在 MSMQ 中使用此方案,即使在技术上使用触发器也是可行的。

如果您的侦听器仅侦听具有某些特殊属性的消息,确定哪个侦听器应该使用该消息(即您在队列中搜索消息),那么您绝对应该使用三个队列。

【讨论】:

多播是一条消息到多个队列,而不是多个监听器。 @John:谢谢我修改了我的答案。【参考方案3】:

“文档明确指出 MSMQ 用于“一对一”通信,这意味着监听器不应超过一个。”

你有这个链接吗?

MSMQ 使用两种传递方式: 1-1:一个发送者,一个目的队列 1-M : 一个发送方多播到多个目标队列

此外,您可以在一个队列中拥有多个侦听器。 听众人数由您决定。 当然,多个侦听器之间会发生争用,因此如果您希望消息只在需要编码/配置一次时被处理。

【讨论】:

我希望看到工作代码演示实现此方案的“最佳实践”:“此外,您可以在一个队列中拥有多个侦听器。侦听器的数量取决于您。当然,多个侦听器之间将存在争用,因此如果您希望仅在需要为此编码/配置时处理消息。”对于链接,我目前正在搜索。 遗憾的是,我是一名不会编码的 MSMQ 基础架构专家。 我也想将你的答案标记为答案,因为它增加了 Ladislav Mrnka 的答案,但不幸的是这不起作用:(我还试图在 msdn 上找到声称 1-1 的链接最初触发这个问题的场景,不幸的是我再也找不到它了。

以上是关于MSMQ 单(队列)对多(侦听器)方案的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Windows 2012 MSMQ 中连接 Winsoc 套接字

当有大量消息排队时,从 MSMQ 读取速度会变慢

Hazelcast - QueueListener - 多线程或 MDB

在事件监听器中同步多对多关系(Laravel 5.7)

在运行时向兔子侦听器动态添加队列

传入队列消息的永久侦听器