使用JMS + CCDT文件连接到IBM MQ时的负载平衡问题

时间:2018-01-23 15:06:31

标签: java jms load-balancing ibm-mq spring-jms

我们正在尝试使用CCDT文件和JMS配置连接到IBMMQ。 我们能够连接到它,但我们有一个问题:

因为我们使用spring来设置连接工厂和CCDT文件,所以在应用程序启动时会初始化一次,但遗憾的是它一次只选择一个队列管理器,即它将所有消息发送到同一个队列管理器并且它没有负载平衡。

虽然我观察到,如果我在每个请求之前手动设置CCDT文件,那么它能够对队列管理器进行负载平衡,理想情况下,每当我将URL设置为CCDT文件时,我都会决定队列管理器。这是错误的做法。我的期望是使用CCDT文件初始化连接工厂,然后这个配置将能够自己进行负载平衡。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:4)

这是预期的行为。 MQ不会对客户端进行负载平衡,它会对它们进行平衡。连接是最耗时的API调用,并且在相互认证的TLS连接的情况下,可能需要几秒钟才能完成。因此,良好的应用程序设计将尝试连接一次,然后在会话期间保持该连接。 JMS体系结构和Spring框架都期望这种模式。

MQ提供负载分配的方式(同样,不是真正的平衡,而是循环分发)是客户端连接远离群集目标的跃点队列。发往该群集目标队列的消息将在该队列的所有实例中循环。

如果它是请求 - 回复应用程序,则侦听这些群集队列实例上的请求的事物使用来自请求消息的Reply-To QMgr和Reply-To Queue名称来寻址回复消息。在这种情况下,如果QMgr失去连接,请求者可以将QMgr故障转移到QMgr。在集群队列上侦听记录的系统通常不会跨队列管理器进行故障转移,以确保所有队列实例都得到服务,并且由于事务恢复。

简短的回答是CCDT和MQ客户端通常,其中发生MQ负载分配。客户端应该建立连接并尽可能长时间地保持连接。客户端重新连接和CCDT仅用于连接平衡。

负载分配是MQ群集的一项功能。它需要群集队列的多个实例,这些实例通常是远离放置消息的客户端应用程序的网络跳跃。