![通过负载平衡器分配 JMS 会话](https://linux22.com/image/742013/%E9%80%9A%E8%BF%87%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1%E5%99%A8%E5%88%86%E9%85%8D%20JMS%20%E4%BC%9A%E8%AF%9D.png)
当某个故障节点恢复时,通过平衡器分配会话会出现一个非常严重的问题。
我简单描述一下两个模块的交互是怎么安排的:
一方面,WebShere Application Server(以下简称WAS)上的应用程序
另一方面,尚不清楚哪个应用程序
它们之间 - 2 个 WebSphere MQ 服务器
WAS 应用程序通过平衡器连接到 WebShere MQ
第二方直接连接到 MQ 服务器(因为它可以自行分配连接)
出现问题时:
- 其中一个 MQ 服务器崩溃。此时,所有会话由平衡器分配到剩余的其中一个 MQ 服务器。第二个应用程序也继续使用一个 MQ 服务器。没有问题。
- 这需要一些时间,MQ 服务器才能恢复工作。第二个应用程序立即恢复与第二个 MQ 服务器的连接。平衡器继续将所有会话保留在一个节点上,因为这个 JMS 和连接池已经足够了(这里可能值得一提的是,应用程序仅通过队列连接工厂工作,没有激活规范)。因此,WAS 服务器不会读取应用程序 2 放置在服务器 MQ 上的消息,直到连接池不足并且打开了新的会话,该会话已由平衡器分发到第二个 MQ。但这个周期可能很长,50% 的消息将陷入超时(由应用程序 2 超时)。
因此就有了这个问题。
是否有可能以某种方式组织该过程,以便在恢复第二个 MQ 时,平衡器上的部分会话将被转移到第二个 MQ 服务器,或者将从 WAS 端(立即)生成一个新会话(例如,如果我们开始使用激活规范)?
答案1
如果图表左侧的应用程序仅服务于右侧应用程序的请求,则在当前 IBM MQ v9.1 LTS 及更低版本下,一个选项是将应用程序部署两次到每个 WAS 服务器,其中每个实例都配置为绕过负载平衡器直接连接到单个 IBM MQ 队列管理器。这样,当一个 MQ 服务器发生故障时,每个 Websphere 应用程序服务器仍然具有从一个应用程序实例到另一个 MQ 服务器的连接,以服务发送到可用 MQ 服务器的请求,并且当发生故障的 MQ 服务器重新启动时,每个 Websphere 应用程序服务器上的第二个应用程序实例将重新连接到该队列管理器并为其提供服务。
在 MQ v9.1 CD(持续交付)中,IBM 添加了一项称为统一集群的新功能,其中队列管理器和客户端协同工作,以保持可用队列管理器之间的连接负载平衡。使用此新功能,当第二个队列管理器恢复时,第一个队列管理器将通知一半连接的客户端断开连接并重新连接到第二个队列管理器。
请参阅 IBM 知识中心页面IBM MQ 9.1.x>IBM MQ>规划>基于多个队列管理器的架构>规划分布式队列和集群>设计集群>统一集群>自动应用程序平衡:
当同一应用程序的实例数至少与队列管理器数一样多时,统一集群会不断确保每个队列管理器都至少连接有一个该应用程序的实例。