我有这样的场景:一个客户端将消息发送到msmq队列实例,并且有3个进程侦听此队列。我希望能够让每个实例选择不同的消息并进行处理。
我知道这是队列的常见用法场景,我已经使用MSMQ,.NET和C#为此工作了代码。
但是我想知道msmq是否是我最好的选择 - 文档明确指出MSMQ用于“一对一”通信,这意味着不应该有多个听众。
这让我感到疑惑,我正在为我的用例做正确的解决方案吗?或者反过来说,我是否必须为每个侦听器创建一个队列并在工作流的前一部分中分发消息?
非常感谢在此类场景中展示MSMQ用法的工作示例的链接。
由于
答案 0 :(得分:8)
据我了解,您使用多个侦听器来执行负载平衡等操作。这是绝对有效的方案,它通常用于群集环境或负载平衡方案中,其中单个侦听器无法使用所有传入消息。顺便说一句。集群BizTalk以相同的方式使用MSMQ消息。
一对一意味着将一条消息传递给一个侦听器,但这并不意味着每个队列只能拥有一个侦听器。如果所有的监听器都进行相同的处理,并且它不依赖于哪一个将选择该消息,那么它仍然是一对一的。
也可以使用一个队列将一条消息传递给多个侦听器。 MSMQ不建议使用此方案,即使技术上可以使用触发器。
如果您的侦听器只侦听具有某些特殊属性的消息,确定哪个侦听器应该使用该消息(即您在队列中搜索消息),那么您肯定应该使用三个队列。
答案 1 :(得分:5)
“文件明确指出MSMQ是用于”一对一“的沟通,这意味着不应该有多个听众。”
你有这个链接吗?
MSMQ使用两种递送方式:
1-1:一个发件人,一个目的地队列
1-M:一个发送方组播到多个目标队列
此外,您可以在队列中拥有多个侦听器。 听众的数量取决于你。 当然,多个侦听器之间会存在争用,因此如果您希望仅在需要对其进行编码/配置时才处理消息。
答案 2 :(得分:1)
听起来你需要服务总线 - 然而,它们往往有点重量级,所以它可能有点矫枉过正。使用服务总线,您可以设置发布 - 订阅方案,其中任意数量的侦听器都可以订阅消息。 NServiceBus是一种使用起来很简单的服务总线(它建立在MSMQ之上);有一个免费版本,每秒限制为30条消息。 Rhino ESB也声称自己是轻量级的。