ce97
作者ce97·2015-04-02 20:27
软件开发工程师·某某某

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

字数 6756阅读 1601评论 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通道管理方面的几个有效措施加以简单讨论。

1、如何配置操作系统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 <value>;

/etc/inconfig tcp_keepintvl <value>;

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

2、AdoptNewMCA的使用技巧

在WebSphere MQ的5.2版本以上,新增加了一个控制通道运行的新的参数,既AdoptNewMCA,它可以通过修改qm.ini文件的Channels一节进行修改,如:

Channels:

AdoptNewMCA=ALL

它可以被设置为:NO,SVR,SNDR,RCVR,CLUSRCVR,ALL,FASTPATH等值。

当MQ接收到启动通道的请求,但是同时它发现与该通道对应的amqcrsta的进程已经存在,这时,该进程必须首先被停止,然后,通道才能启动。AdoptNewMCA的作用就是停止这种进程,并且为新的通道启动请求启动一个新的进程。

与通过前面指出的修改TCP/IP参数的方法功能类似,利用该属性,可以将状态处于running状态的接收端通道强行终止,使发送端的通道启动操作或请求得以成功。

如果为某一通道指定了AdoptNewMCA的属性,但是新的通道由于"channel is already running"而启动失败,则它可以:

1) 新的通道通知之前的通道停止

2) 如果旧的通道在AdoptNewMCATimeout的时间间隔内没有接受该停止请求,相应的进程(或线程)被kill掉

3) 如果旧的通道经过步骤2仍未终止,则当第二个AdoptNewMCATimeout时间间隔到达时,MQ终止该通道,同时产生"channel in use"的错误。

3、Disconnect Interval的使用技巧

Disconnect Interval是发送和服务类型的通道所具有的一个参数,它的作用是:在它设置的时间间隔内,如果传输队列为空即通道上没有消息通过时,通道就会被停止。设置完Disconnect Interval参数之后,当发送方重起通道时,通道就会被正常启动。

Disconnect Interval的值会地影响通道的性能。如果把Disconnect Interval的值设置得非常小,会导致通道的频繁启动;反之,如果把Disconnect Interval的值设置得很大,则意味着即使通道上很长时间没有消息,系统资源也会被长期占用,从而影响系统的性能。因此,利用改变Disconnect Interval的值,我们可以有效地改善通道的性能。

4、Heart Beat Interval的使用技巧

与Disconnect Interval相对应的是Heart Beat Interval这一参数(仅针对WebSphere MQ for AIX、HP-UX、OS/2、Sun Solaris、Windows NT/2000 V5.1以上)。它的作用是:在Heart Beat Interval指定的时间间隔内,如果传输队列上没有一直没有消息到达,发送方MCA会向接收方MCA发送一个心跳信号,据此给接收方通道以停止的机会,在这种情况下,它不必等待Disconnect Interval超时,也会将通道停止下来。同时,它会释放用来存贮大消息的内存空间并关闭接收方的队列。

为了使HeartBeat Interval和Disconnect Interval这两个参数更有效地发挥作用,一般情况下需要让Heart Beat Interval设置值小于Disconnect Interval设置值。

另外,如果我们使用的传输协议是TCP/IP,我们也可以利用设置TCP/IP的socket的SO_KEEPALIVE参数来实现这一功能。设置完SO_KEEPALIVE参数,并设置时间间隔之后,TCP/IP本身就会定期去检测另一端连接的状态,如果对方连接已断开,通道也会被停止。在这里,TCP/IP的时间间隔也应小于WebSphere MQ通道的Disconnect Interval的值。

5、ShortRetry和LongRetry的使用技巧

在发送类型等类型的通道属性中,还有四个参数是与通讯恢复和通道连接有关的,它们是:shortrty,shorttmr,longrty,longtmr,它们的缺省值分别是:10,60,999999999,1200,分别代表短重试时间间隔和次数以及长重试时间间隔和次数,它们的作用和含义在于当通道从running变为retrying状态时,按照这四个参数规定的时间间隔和次数进行通道重新连接的尝试,并且先进行短重试,短重试结束后,再进入长重试。

在设计这四个参数时,要注意以下两点:

1) 要确保短重试+长重试的时间〉故障恢复时间

例如:假设您估计您的系统故障恢复时间为1个小时,则要设置 shorttmr*(time of shortrty)+longtmr*(time of shortrty)>;2 hours 这样,才能保证在故障恢复之后,通道仍然能够自动进行重新连接的尝试。

2) 重试间隔将影响自动恢复的效率

例如:如果您把短重试总时间设定为10分钟,而长重试时间间隔设为1小时,而网络在15分钟后,便已经恢复,可是此时,由于通道已经进入长重试阶段,它将在1个小时之后,才能通过长重试恢复通道的正常运行。相反,也不必把重试间隔设置得太短,应根据需要和用户的实际情况进行适中的设置。

6、停止通道的几种方法

对于WebSphere MQ系统管理任务而言,很重要的一部分操作是对通道的管理和监控。正常情况下,消息通道要在两个队列管理者之间保持持续运行,由WebSphere MQ系统管理员或当Disconnect Interval超时时通道正常中止。在发送方停止通道是非常有效的,但是需要系统管理员的干预。而在通道接收方,情况就比较复杂,这是由于接收方MCA处于被动地位,它只是侦听通道上传过来的信息,而无法从接收方正常停止通道运行。

对于通道操作,我认为可根据以下三种情况来控制通道启停。

如果希望通道持续运行,我们可在发送方控制通道的停止,当通道被中断,需要系统管理员来重新启动。

如果希望仅当通道上有消息发送时保持通道运行,我们可以设置通道的Disconnect Interval属性来实现。

在WebSphere MQ for AIX、HP-UX、OS/2、Sun Solaris、Windows NT/2000 V5.1以上版本中,我们可以通过设置通道的Heart Beat Interval属性来实现,它可以使通道的接收方向发送方发送心跳信号来检测发送方的状态,并停止通道。

综上所述,通道是WebSphere MQ产品的精华,是MQ的一些重要功能的技术保障,通道使用的科学与否,直接影响MQ功能和优势的发挥以及MQ系统管理的难易,本文只是列举了其中重要的一些技巧和方法,以和读者共享。在WebSphere MQ的配置使用和系统管理过程中,我们可以通过灵活配置操作系统的TCP/IP参数和通道的有关属性来设计WebSphere MQ的消息通道以及控制MQ通道的运行,从而更好地发挥WebSphere MQ的强大功能!

关于作者

娄丽军, IBM公司  软件部售前工程师,1998年加入IBM公司软件部,四年来一直从事IBM通讯及业务整合中间件(WebSphere Business Integration家族)产品的技术支持工作,是软件部从事该领域技术支持时间最长的工程师之一,拥有WebSphere Business Integration相关的产品经验,这些产品包括WebSphere MQ家族的所有产品:MQSeries, MQ Integrator, MQ Workflow以及CrossWorlds等,并具有很多大型项目的支持经验,曾参与国家税务总局,人民银行清算系统、华夏银行电子联行系统、中国联通计费系统、海关与国家税务总局互连系统,以及公安部、铁道部、中信实业银行、电信等重要客户的有关项目的技术支持。

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

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广