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

atu*_*thi 3 java load-balancing jms spring-jms ibm-mq

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

由于我们使用spring来设置CCDT文件的连接工厂,因此在应用程序启动时将其初始化一次,但是不幸的是,它一次只选择一个队列管理器,即它将所有消息发送到同一队列管理器,而没有负载均衡。

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

你能帮我吗?

T.R*_*Rob 5

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

MQ提供负载分配(同样,不是真正的平衡,而是循环分配)的方式是,客户端将一跳与群集目标队列分开。发送到该群集目标队列的消息将在该队列的所有实例之间循环。

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

简短的答案是,一般而言,CCDT和MQ客户端不在发生MQ负载分布的地方。客户端应建立连接并保持尽可能长的时间。客户端重新连接和CCDT仅用于连接平衡。

负载分配是MQ集群的功能。它需要群集队列的多个实例,并且这些实例通常是与放置消息的客户端应用程序之间的网络跳转。