MQ最大连接数问题

4
我有一个Java客户端,使用10个连接连接到MQ。这些连接在Java客户端运行期间保持打开状态。对于每个线程,我们创建一个消息,创建一个会话,发送消息并关闭会话。我们使用Spring CachingConnectionFactory,并且有一个sessionCacheSize为100。我们被我们的MQ工程团队告知,我们的队列管理器最大连接数为500,而我们已经超出了这一限制。QM.ini文件的内容为:
maxChannels=500
maxActiveChannels=256
maxHandles=256

我在MQ Explorer中观察到的是,队列上的打开输出计数保持静态为10,但是如果我们在2个队列之间进行负载均衡,每个队列上都是10,即使我们仍然只有10个连接。所以我想知道的是,在MQ术语中,JMS连接和会话相当于什么?
我曾经认为,连接等同于活动通道,而会话是一个句柄,因此我们可能超出了句柄的数量,因为我们打开(和关闭)的会话数量达到了数百或数千,而我们只有10个连接。尽管与此相反,IBM技术说明书“解释JMS连接工厂的连接池和会话池设置”下面的代码片段表明,最大通道数应该大于最大会话数,但是我们永远不知道这一点,因为它取决于负载(除非这应该大于sessionCacheSize?)。
每个会话代表与队列管理器的一个TCP/IP连接。在此处提到的设置中,最多可以有100个TCP/IP连接。如果您正在使用WebSphere MQ,则重要的是要调整队列管理器的MaxChannels设置,该设置位于qm.ini文件中,以大于每个JMS连接工厂从连接到队列管理器的最大可能会话数之和的值为目标。感谢您对如何最佳配置MQ的任何帮助。
1个回答

5
假设您在MQ通道上将最大会话数设置为1(MQ v7和v7.5的默认值为10),那么JMS连接将导致一个TCP连接(MQ通道实例),而JMS会话将导致另一个TCP连接(MQ通道实例)。
从您的更新信息中看,您已配置了10个JMS连接,并且在Spring中将sessionCacheSize设置为100,因此10 x 100表示可能创建1000个MQ通道实例。打开输出计数将显示有多少“活动”的JMS会话正在尝试发送消息,而不一定是有多少被“缓存”。
MQ通道上的对话共享可能对您有所帮助,因为它定义了可以在一个TCP连接(MQ通道实例)上共享多少逻辑连接。因此,默认的10个对话意味着您可以创建10个JMS会话,这些会话仅在一个TCP连接上运行。

你好,感谢回复。请原谅我的无知,max conversations 是否与 qm.ini 文件中的 max channels 或 max active channels 有关系呢?我们似乎超出了这些属性的限制。当会话限制被突破时,是否仅为会话创建创建 TCP 连接,或者所有会话都是如此?此外,我们只有一个 CachingConnectionFactory 实例,所有连接都是从该实例创建的,那么会话缓存大小是每个连接的(而不是所有连接的)100吗? - Bazza
最大通道数是指在队列管理器上可以定义的通道数量。而最大活动通道数是指在队列管理器上可以同时处于活动状态的通道实例数量。最大对话数是通道本身的属性,控制在一个通道实例上可以复用多少个不同的逻辑连接。qm.ini属性将应用于整个队列管理器,因此可能会有多个应用程序进行连接。你应该询问MQ管理员当前通道实例的使用情况。 - whitfiea
好的,我明白了。那么sessionCacheSize是针对单个CachingConnectionFactory在所有连接之间共享的吗(因此在10个连接中为100),还是针对每个连接(在这种情况下为1000)? - Bazza
阅读Spring文档以获取更多详细信息,唯一提到的是缓存是“每个JMS会话类型”。因此,我无法确定它是否为使用该CachingConnectionFactory创建的每个JMS连接的缓存或整个CachingConnectionFactory的作用域,这似乎是另一个需要在SO上提问的问题。 - whitfiea
是的,我得出了同样的结论。 - Bazza

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