天天看點

有關WebSphere MQ消息通道管理的幾點技巧

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_MACHINE/CurrentControlSet/Services/Tcpip/Parameters下的以下三個參數:

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值,則當網絡出現故障時,發送端的通道停下來之後,接收端的通道會仍然停不下來。

繼續閱讀