两个消费者在同一个Websphere MQ JMS队列上,两者都接收相同的消息。

3
我正在与一位试图使用IBM Websphere MQ的JMS队列实现负载平衡行为的人合作。因此,他们配置了多个Camel JMS消费者来从同一个队列中读取。尽管根据JMS规范(至少在我上次查看时)此行为是未定义的,但他们期望一种轮询/负载平衡行为。虽然规范将此留给厂商自行决定,但我相信Websphere MQ的正常行为是仅将消息传递给其中一个消费者,并且可能会进行某种类型的负载平衡。例如,请参见此处:When multi MessageConsumer connect to same queue(Websphere MQ),how to load balance message-consumer? 但在这种特殊情况下,似乎两个消费者都接收到了相同的消息。
有没有更熟悉Websphere MQ的专家可以解释一下?是否有任何情况下预期出现这种行为?是否有任何配置更改可以缓解这种情况?
我倾向于告诉大家使用本地的Websphere MQ集群设施,并远离多个消费者指向同一个队列,但这对他们来说是一个很大的变化,因此我希望找到一种使其工作的方法。
虽然我不喜欢依赖任何未定义的东西,但如果他们愿意依赖IBM特定的行为,那就由他们决定。
1个回答

3
他们同时接收相同的信息的唯一方法是:
  1. 有多份消息副本。
  2. 应用程序在没有锁定的情况下浏览消息,然后回来将其删除。
  3. 应用程序回退交易并再次使消息可用。
  4. 连接在应用程序确认消息之前被切断。
在队列中让多个应用程序竞争消息是一种推荐做法。如果一个应用程序崩溃,则仍会服务于队列。在集群中这是至关重要的,因为集群将继续将消息发送到未服务的队列实例,直到它填满。
如果这是开发系统,请安装SupportPac MA0W,并告诉它跟踪那个特定的队列,您将能够看到正在发生的情况。
请参阅JMS规范4.4节。提供者永远不应传递已确认的消息的第二份副本。在4.4.13中对会话处理做出了异常,我在#4中进行了解释。这是非常明确的,并且是官方规范的一部分,因此不是IBM特有的行为。

谢谢T.Rob。我已经多年没有看过实际规范了,但我曾认为当队列上有多个消费者(而不是主题)时,行为是完全未定义的。但也许“永远不会传递已确认消息的第二份副本”的规定胜过了那个。 - mindcrime
竞争消费者之间的交付顺序是未定义的。消息的交付也受到QOS设置的影响。如果应用程序指定了延迟确认,那么可能会收到重复的消息。但是,如果消息被排队并确认,并且没有回滚或出现异常,您将获得一次且仅一次的交付。 - T.Rob

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