midware
作者midware·2010-12-11 13:51
·

有关WebSphere MQ消息通道管理的几点技巧

字数 3727阅读 2904评论 0赞 0
 WebSphere MQ作为IBM软件家族的消息传输中间件产品,以其出色的特性和功能在业界享有盛誉。WebSphere MQ独特的安全机制、简便快速的编程风格、卓越不凡的稳定性、可扩展性和跨平台性, 以及强大的消息通讯能力,使得它在银行、电信,还是在交通运输、政府机关等各行各业,赢得了很高的市场份额。在中国,WebSphere MQ同样拥有广泛的用户基础和许许多多的成功案例。它不仅具有跨平台、跨网络的特性,而且以其特有的先进机制保证对消息的"Once and Once only"的传输,做到不丢失、不复传。

  在WebSphere MQ给客户带来的众多价值中,有一点十分重要,就是它的通讯感知和恢复机制,尤其适用于我国目前的现状,在我国很多地方存在网络线路质量差,网络状态不稳定的现状。因为WebSphere MQ在支持同步通讯的同时,提供了基于消息队列存储- 转发机制的异步通讯模式,应用程序只需将消息交给WebSphere MQ,就由WebSphere MQ负责将消息安全、可靠地发送出去,不再需要应用和人工的干预,当网络出现故障的情况下,或对方主机发生故障时,WebSphere MQ能够作到不需要人工干预,自动探测网络状况的好坏,并且在网络恢复正常之后能够继续正常工作。

  而这一功能需要对操作系统的 TCP/IP参数和MQ本身有关配置参数的正确配置为前提;另一方面,在WebSphere MQ的系统配置和管理中,对通道(Channel)的管理是最复杂也是最重要的部分,本文将对如何利用TCP/IP参数配置来更好地实现通讯恢复作一讨 论,并对有关WebSphere MQ通道管理方面的几个有效措施加以简单讨论。

  如何配置操作系统TCP/IP参数和MQ从而实现断网续传和故障恢复

  WebSphere MQ作为一个消息传输产品,本身是架构在TCP/IP之上的,因此与操作系统或网络底层的TCP/IP特性有着密切的关系,很多情况下我们要借助于修改操 作系统的YCP/IP参数,来使它更好地为WebSphere MQ服务,从而更加完善地发挥WebSphere MQ的强大功能,现仅对TCP/IP参数设置的有关技巧作一简单讨论,并举例加以说明。

  当我们要在WebSphere MQ的两个队列管理器之间建立通讯时,由于WebSphere MQ的通道是单向的,我们必须要建立两条通道(Chanel),比如建立两条类型分别为发送(sender)类型和接收(receiver)类型的通道来 实现两个WebSphere MQ Server之间的通讯,在通道的两端WebSphere MQ利用MCA(消息通道代理)来管理和监控通道的起停等运行状态,并对通道两端的消息系列号(Message Sequence Number)等进行协同管理,以保证WebSphere MQ对消息的"Once and Once Only"的传输。对WebSphere MQ而言,在其系统配置配置文件mqs.ini文件中,在mqs.ini文件中,包含了对队列管理器的日志大小、通道属性以及通过XA标准与数据库协同工作时的有关参数的设置,除此之外,有一节用于控制有关TCP/IP特性的信息,即:

  TCP:

  KeepAlive=Yes或

  KeepAlive=No

  它的作用在于:当设置KeepAlive=Yes时,表示操作系统的TCP/IP参数设置对WebSphere MQ生效。

  由于WebSphere MQ接收通道的MCA处于通讯的被动方,它一直等待从发送方传来的消息,因此它不知道什么时候发送方会停止发送消息,也不知道当网络出现故障时,发送方什 么时候会从工作状态变为停止状态。这时由于出现网络故障,网络连接被断掉,发送方通道状态会由running状态变为retrying状态,发送方会试图 重新建立网络连接,而这时接收方的通道却没有停下来,仍处于一种假"running"的状态,相应的我们会得到一个"Channel is in use"的错误信息,导致发送端想重起却重起不了。

  出现这一现象的原因是:当发送方MCA启动通道并长时间没有断开连接,这时出现网络故障,TCP/IP的socket连接被破坏,当发送停止通 道并重新启动时,它需要建立一个新的socket连接,而接收方仍停留在原来的RECEIVE调用上,它的socket特征与发送方新的socket特征 不一致,因此新的socket连接建立失败。

我们可以利用TCP/IP特性来克服这一点,更好地实现断网续传。通常,操作系统的TCP/IP参数的缺省设置是2个小时(常见的操作系统平台如:Windows 2000/NT以及AIX,HP-UX,Sun Solaris,Linux等,缺省设定均为2个小时)即发送KeepAlive探测包的时间是2小时,所以需要2个小时的时间它才会获知网络连接已经断开,这对于我们来说无疑是无法接受的。

  在这种情况下,我们可以通过配置TCP/IP KeepAlive参数来提高TCP/IP的响应速度,从而实现网络故障时WebSphere MQ能够迅速断开通道连接从而重新启动通道,实现断网续传的强大功能。只有这样,在发送端,MQ的channel才能由running状态变为 retrying状态,同时,在接收端,MQ的channel才能由running状态变为not found状态, 这样,在网络或主机重新恢复时,通道才能重新建立起连接,恢复running状态。

  要实现上述功能,我们需要作以下两方面的工作:

  1)修改WebSphere MQ系统配置文件mqs.ini,增加如下一节:

  TCP:

  KeepAlive=Yes

  目的是使系统的TCP/IP设置对WebSphere MQ生效。

  2)修改操作系统的TCP/IP参数;

  在不同的系统上,修改TCP/IP参数的方法略有不同,现仅以Windows 2000/NT、RISC6000和HP为例作一简单说明。

  在Windows NT平台上, 我们利用regedit来修改系统注册表,修改HKEY_LOCAL_MACHINECurrentControlSetServicesTcpipParameters下的以下三个参数:

  KeepAliveInterval,设置其值为1000

  KeepAliveTime,设置其值为300000(单位为毫秒,300000代表5分钟)

  TcpMaxDataRetransmissions,设置其值为5

  在RISC6000平台上, 用no命令修改如下参数:

  tcp_keepidle保持TCP/IP连接的时间,单位为0.5秒,缺省值为14,400,即两个小时,我们可将它设为5分钟;

  tcp_keepinittcp连接初始timeout值,单位为0.5秒,缺省值为150,我们可将它设为50;

  tcp_keepintvl连接间隔,单位为0.5秒,缺省值为150,我们可将它设为50;

  我们也可以修改/etc/rc.net文件,

  /usr/sbin/no -o tcp_keepidle=240

  /usr/sbin/no -o tcp_keepinit=50

  /usr/sbin/no -o tcp_keepintvl=50

  注意:直接使用命令行修改,在机器重启后,会失效;修改rc.net文件,可以做到永久生效。

  在HP平台上,

  对于HP-UNIX V10.20及其在此之前的版本,用/usr/contrib/bin nettune命令来修改有关参数;

  对于HP-UNIX V10.30及其以上版本,用/usr/bin/ndd命令来修改有关参数。

  在SUN Solaris平台上,

  用ndd -set /dev/tcptcp_keepalive_interval NNN命令来修改有关参数,tcp_keepalive_interval的单位为毫秒,缺省值为7200000毫秒,即2个小时。

  在SCO OpenServer平台上,

  tcp_keepalive 和 tcp_keepidle 相同,其原先默认值为 7200 秒,可设为 600秒。tcp_keepintvl 其原先默认值为 75 秒,可设为15秒。均以"秒"为单位。

  运行命令 ifconfig 命令修改:

  /etc/inconfig tcp_keepidle

  /etc/inconfig tcp_keepintvl

  需要注意的一点是通道两端的KeepAlive参数要保持协调一致,若发送端的KeepAlive值小于接收端的KeepAlive值,则当网络出现故障时,发送端的通道停下来之后,接收端的通道会仍然停不下来。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广