繁体   English   中英

有关IBM MQ Connection和会话数的最佳实践

[英]Best practice on IBM MQ Connection and number of sessions

我们使用IBM MQ作为具有多实例设置的消息传递层。 使用XMS客户端(版本7.5)的.NET应用程序将读取来自多个队列的消息。 由于消息量很大,我已经为每个队列创建了大约5个连接来读取消息。 并且有4个这样的队列。 因此,在任何时间点的应用程序中,有20个连接和20个会话打开。 通过此设置,我面临两个问题:

  • 通常我在打开连接时得到两个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)

经过适当调整后,QMgr可以处理数千个连接。 MQRC_HOST_NOT_AVAILABLE表明您正在遇到资源限制,并且MQRC_CONNECTION_BROKEN错误表明您的会话没有干净地结束并且正在被孤立。

不幸的是,没有足够的信息来诊断这个问题。 如果我尝试诊断,我想知道所有相关调整参数的配置设置:

  • MAXHANDS
  • SHARECONV
  • QMgr和通道上的最大通道实例设置
  • 监听器积压设置
  • MAXUMSGS
  • Keepalive,心跳和其他频道调整

在操作上,我想知道发生这种情况时运行了多少个通道实例。

我还想知道在全局错误日志和QMgr的错误日志中看到了什么错误(如果有的话)。

我将查询未提交的事务并在错误日志中查找回滚事件。 使用默认调整的QMgr事务回滚可能会导致信道丢失,如果不处理异常,这不是人们直观寻找的东西。

这些答案可能会导致调整QMgr,增强应用程序或更多诊断,之后我会再试一次。

但是这个问题在这一点上甚至没有包括基本的诊断信息,因此不可能以任何信心确定根本原因。 基于所写的问题,我可以说的是,我不会做的一件事就是尝试通过减少应用程序中的连接数来解决这个问题,因为应用程序设计的合法数据对于任何QMgr来说都是微不足道的。

Connection上没有太多动作。 它用于创建临时目的地。 会话是所有操作发生的地方。 所以只需一个连接即可。

MQRC_HOST_NOT_AVAILABLEMQRC_CONNECTION_BROKEN可能不是由于您正在创建的连接/会话数,因为队列管理器可以支持大量连接。

您的应用程序正在使用事务会话和消息侦听器。 你是如何进行交易的? 你能告诉我们代码吗? 您是否为收到的每条消息调用了commit?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM