我正在与一个尝试使用IBM Websphere MQ的JMS队列实现负载平衡行为的人合作。因此,它们有多个Camel JMS消费者配置为从同一个Queue中读取。尽管这种行为在JMS规范中是未定义的(反正上次我是这么看的),但他们期望一种循环/负载平衡行为。虽然规范没有定义这一点,但我认为Websphere MQ的正常行为是只将消息传递给一个消费者,并且它可能执行某种类型的负载平衡。请看这里,例如:当多个MessageConsumer连接到同一个队列(Websphere MQ)时,如何对消息使用者进行负载平衡?
但是在这个特殊的例子中,看起来两个消费者都收到了相同的消息。
Websphere MQ方面的专家是否可以解释一下这个问题?在什么情况下,这种行为是预期的?是否有任何配置更改可以缓解这种情况?
我倾向于告诉这里的每个人使用本机Websphere MQ集群功能,不要让多个消费者指向同一个Queue,但这对他们来说将是一个很大的变化,所以我很想找到一种方法来实现这一点。
并不是说我喜欢依赖任何未定义的东西,但是如果他们愿意依赖IBM的特定行为,我会让他们自己决定。
让它们同时接收到相同消息的唯一方法是:
- 消息有多个副本。
- 应用程序正在浏览没有锁定的消息,然后循环删除它。
- 应用程序正在退出交易并使消息再次可用。
- 在应用程序确认消息之前断开连接。
让多个应用程序竞争队列中的消息是推荐的做法。如果一个应用程序宕机,队列中仍然有服务。在集群中,这是至关重要的,因为集群将继续将消息定向到未服务的队列实例,直到它填满为止。
如果是Dev系统,安装SupportPac MA0W并告诉它只跟踪一个队列,你将能够确切地看到正在发生什么。
请参阅第4.4节中的JMS规范。提供者绝不能传递已确认消息的第二个副本。4.4.13中的会话处理出现了异常,我在上面的#4中介绍过。这是非常明确的,并且是官方规范的一部分,因此不是ibm特有的行为。