IBM MQ Connection 和会话数的最佳实践
Best practice on IBM MQ Connection and number of sessions
我们使用 IBM MQ 作为具有多实例设置的消息传递层。使用 XMS 客户端(7.5 版)的 .NET 应用程序将从多个队列中读取消息。由于消息量很大,我为每个队列创建了大约 5 个连接来读取消息。并且有4个这样的队列。所以在应用程序中的任何时间点,都有 20 个连接和 20 个会话打开。使用此设置我面临两个问题:
我经常在打开 connections.One 时遇到两个 XMS 异常 MQRC_HOST_NOT_AVAILABLE ((2538, X'9EA') 尝试将会话分配给远程系统失败。)另一个是 MQRC_CONNECTION_BROKEN(与队列管理器的连接丢失。)
关闭应用程序时,关闭所有会话和连接需要更多时间,因为它们太多了。
所以我在考虑减少连接数。只需为每个队列创建一个连接并为每个队列打开 5 个会话。这样,连接数将减少到 4 个(从 20 个)。所以我认为上述两个问题都将得到解决(尚未尝试)
因此希望有知情人士分享他们处理上述情况的最佳做法的经验。与每个连接打开一个会话相比,如果我们为每个连接打开多个会话,传递消息会有任何延迟吗?
我使用的代码如下:
private XMSFactoryFactory xMSFactoryFactory;
private IConnectionFactory connectionFactory;
private IConnection connectionWMQ;
private ISession sessionWMQ;
private IDestination destination;
private IMessageConsumer messageConsumer;
xMSFactoryFactory= XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
connectionFactory = _xMSFactoryFactory.CreateConnectionFactory();
// Set queue manager name, set server names, channel, use
// XMSC.WMQ_CM_CLIENT as WMQ_CONNECTION_MODE
connectionWMQ = _connectionFactory.CreateConnection();
sessionWMQ = _connectionWMQ.CreateSession(true, AcknowledgeMode.SessionTransacted);
destination = sessionWMQ.CreateQueue(_queueSettings.QueueName);
messageConsumer = sessionWMQ.CreateConsumer(_destination);
messageConsumer.MessageListener = new MessageListener(ProcessNewMessage)
Connection 上没有太多操作。它用于创建临时目的地。会话是所有操作发生的地方。所以只有一个连接就足够了。
MQRC_HOST_NOT_AVAILABLE
和 MQRC_CONNECTION_BROKEN
可能不是因为您正在创建的 connections/sessions 数量,因为队列管理器可以支持大量连接。
您的应用程序正在使用事务处理会话和消息侦听器。您如何提交交易。你能告诉我们代码吗?您是否为收到的每条消息都调用 commit?
适当调整后的 QMgr 可以处理数千个连接。 MQRC_HOST_NOT_AVAILABLE
表明您遇到了资源限制,MQRC_CONNECTION_BROKEN
错误表明您的会话没有干净地结束并且被孤立了。
不幸的是,没有足够的信息来诊断这个问题所写的问题。如果我尝试诊断,我想知道所有相关调整参数的配置设置:
- MAXHANDS
- SHARECONV
- QMgr 和通道的最大通道实例设置
- 侦听器积压设置
- MAXUMSGS
- Keepalive、心跳等通道调优
在操作上,我想知道发生这种情况时 运行 有多少频道实例。
我还想知道在全局错误日志和 QMgr 的错误日志中看到了什么错误(如果有的话)。
我会查询未提交的事务并在错误日志中查找回滚事件。使用默认调整的 QMgr,如果不处理异常,事务回滚可能会导致通道丢失,这不是人们直观地寻找的东西。
这些问题的答案可能会导致调整 QMgr、增强应用程序或进行更多诊断,之后我会再试一次。
但是这个问题此时甚至还没有包括基本的诊断信息,因此不可能有任何信心地确定根本原因。根据所写的问题,我可以说的是,我 不会 做的一件事是尝试通过减少应用程序中的连接数来解决这个问题,因为 20 是合法的应用程序专为任何 QMgr 设计。
我们使用 IBM MQ 作为具有多实例设置的消息传递层。使用 XMS 客户端(7.5 版)的 .NET 应用程序将从多个队列中读取消息。由于消息量很大,我为每个队列创建了大约 5 个连接来读取消息。并且有4个这样的队列。所以在应用程序中的任何时间点,都有 20 个连接和 20 个会话打开。使用此设置我面临两个问题:
我经常在打开 connections.One 时遇到两个 XMS 异常 MQRC_HOST_NOT_AVAILABLE ((2538, X'9EA') 尝试将会话分配给远程系统失败。)另一个是 MQRC_CONNECTION_BROKEN(与队列管理器的连接丢失。)
关闭应用程序时,关闭所有会话和连接需要更多时间,因为它们太多了。
所以我在考虑减少连接数。只需为每个队列创建一个连接并为每个队列打开 5 个会话。这样,连接数将减少到 4 个(从 20 个)。所以我认为上述两个问题都将得到解决(尚未尝试)
因此希望有知情人士分享他们处理上述情况的最佳做法的经验。与每个连接打开一个会话相比,如果我们为每个连接打开多个会话,传递消息会有任何延迟吗?
我使用的代码如下:
private XMSFactoryFactory xMSFactoryFactory;
private IConnectionFactory connectionFactory;
private IConnection connectionWMQ;
private ISession sessionWMQ;
private IDestination destination;
private IMessageConsumer messageConsumer;
xMSFactoryFactory= XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
connectionFactory = _xMSFactoryFactory.CreateConnectionFactory();
// Set queue manager name, set server names, channel, use
// XMSC.WMQ_CM_CLIENT as WMQ_CONNECTION_MODE
connectionWMQ = _connectionFactory.CreateConnection();
sessionWMQ = _connectionWMQ.CreateSession(true, AcknowledgeMode.SessionTransacted);
destination = sessionWMQ.CreateQueue(_queueSettings.QueueName);
messageConsumer = sessionWMQ.CreateConsumer(_destination);
messageConsumer.MessageListener = new MessageListener(ProcessNewMessage)
Connection 上没有太多操作。它用于创建临时目的地。会话是所有操作发生的地方。所以只有一个连接就足够了。
MQRC_HOST_NOT_AVAILABLE
和 MQRC_CONNECTION_BROKEN
可能不是因为您正在创建的 connections/sessions 数量,因为队列管理器可以支持大量连接。
您的应用程序正在使用事务处理会话和消息侦听器。您如何提交交易。你能告诉我们代码吗?您是否为收到的每条消息都调用 commit?
适当调整后的 QMgr 可以处理数千个连接。 MQRC_HOST_NOT_AVAILABLE
表明您遇到了资源限制,MQRC_CONNECTION_BROKEN
错误表明您的会话没有干净地结束并且被孤立了。
不幸的是,没有足够的信息来诊断这个问题所写的问题。如果我尝试诊断,我想知道所有相关调整参数的配置设置:
- MAXHANDS
- SHARECONV
- QMgr 和通道的最大通道实例设置
- 侦听器积压设置
- MAXUMSGS
- Keepalive、心跳等通道调优
在操作上,我想知道发生这种情况时 运行 有多少频道实例。
我还想知道在全局错误日志和 QMgr 的错误日志中看到了什么错误(如果有的话)。
我会查询未提交的事务并在错误日志中查找回滚事件。使用默认调整的 QMgr,如果不处理异常,事务回滚可能会导致通道丢失,这不是人们直观地寻找的东西。
这些问题的答案可能会导致调整 QMgr、增强应用程序或进行更多诊断,之后我会再试一次。
但是这个问题此时甚至还没有包括基本的诊断信息,因此不可能有任何信心地确定根本原因。根据所写的问题,我可以说的是,我 不会 做的一件事是尝试通过减少应用程序中的连接数来解决这个问题,因为 20 是合法的应用程序专为任何 QMgr 设计。