◆呂德奎 崔艷軍
(中國電子科技集團公司第二十八研究所 江蘇 210007)
開源消息中間件復雜并發連接控制的研究與實現
◆呂德奎 崔艷軍
(中國電子科技集團公司第二十八研究所 江蘇 210007)
消息中間件(Message-Oriented Middleware)是解決異構分布式系統中通信與排隊的中間件技術,ActiveMQ是一款基于Java語言的JMS規范的技術實現,是一款企業級常用的JMS產品。本文研究了當前ActiveMQ在涉及多廠家、跨平臺應用時,由于客戶端連接技術不統一、連接不規范、連接后不釋放、數據格式發送不符合規范等因素,碰到的ActiveMQ服務中心因阻塞而宕掉的問題基礎上,分析了當前幾種常用解決手段;依據JMX底層規范與實現,設計并實現了一種基于JMX的客戶端連接問題的解決方法與處理規范、提高ActiveMQ服務中心的運行穩定性。經過大量的實際應用,在數百家客戶端并發連接時、消息量達5千/秒以下時能夠保證ActiveMQ服務中心長期有效的運行,從而提高了企業應用的基礎數據的連續性與穩定性。
ActiveMQ;消息總線;JMX;JMS;并發連接優化
隨著信息網絡的迅速發展,越來越多的公司、單位、組織建立了各種應用系統和資源系統,這些系統對推動信息化的發展起了舉足輕重的作用,然而這些系統可能是建立在不同的環境下,如何進行互操作和資源共享,成為了迫切需要解決的問題。
現有的應用系統中,不同應用之間通信存在以下問題:一是通信雙方的環境如操作系統、協議等不同可能造成雙方無法進行數據交換;二是服務器必須與客戶端保持連接通信的狀態,被動的等待遠程客戶端的通信請求,因此性能隨著用戶數目的增加而不斷下降;三是存在因多用戶、多數據庫的連接,而導致系統死鎖和崩潰的潛在可能;四是明確發送和接收雙方調用的接口,一旦一方發生變化,必須在第一時間通知對方,否則會造成數據的丟失和通信的阻礙;五是程序更新維護難,一旦程序的變更,就需要對系統進行重大修改,增加了維護和管理難度。
為解決以上問題,引進了一個“中間層”,將系統的表示層、邏輯層和數據層分隔開來,成為獨立的單元,這個“中間層”就是中間件。系統的開發者不需要將數據傳輸層和邏輯處理寫入應用程序中,只需通過中間件提供的API,將應用程序與中間件、服務器有效快速的連接起來,實現資源的共享和互操作。
MOM(Message-Oriented Middleware(消息中間件)是解決異構分布式系統中通信和排隊問題的中間件技術,ActiveMQ則是MOM的一個跨語言跨平臺實現[7],是一款常用的企業級JMS實現產品,因其實時性高,數據指標接收速度快,取得了良好業績。但是當涉及數百家單位、而且客戶端連接技術不統一、連接不規范、連接后不釋放、數據格式發送不符合規范等因素時,會導致中心ActiveMQ每隔一個月左右因阻塞而宕掉。
本文針對企業應用現象,在分析了消息隊列中間件國內外應用現狀的基礎上,通過研究ActiveMQ的自身實現架構,主要以JMX(Java Management Extensions,Java管理擴展)為主,通過Java、ActiveMQ的內部設計機制,實現一種按照預先設計的規則庫監控各連接客戶端并對不規則連接進行優化處理方法,保證ActiveMQ中心能夠長期穩定的運行,保障監控數據的順利接收,提高了企業應用的數據連續性與穩定性。
ActiveMQ是基于Java JMS的分布式、跨平臺的消息應用平臺軟件,其使用方法與數據庫類似,需要先建立連接(Connection)與會話(Session),訪問結束時需要顯式關閉連接和連接會話,當客戶端因為某種因素未執行關閉時將會導致ActiveMQ服務中心因最大連接數耗盡而導致服務宕掉,從而影響系統應用、導致企業數據的丟失等問題。
從上述分析可以了解,可以得出以下幾點結論:
(1)ActiveMQ本身有連接數限制,據測試并發連接數達1500以上時,ActiveMQ將會出現存取消息數據效率快速下降、無法建立新的連接等問題。
(2)JVM有大小限制,據測試ActiveMQ最大JVM為1G左右。
(3)ActiveMQ 無法建立新連接,從而無法接收新的消息數據。
(4)ActiveMQ的連接不關閉,可能導致會話死鎖。
(5)ActiveMQ死鎖可能使消息數據無法消費,長期導致JVM溢出,甚至導致服務宕掉。
在上述結論基礎上,研究企業應用現狀,可能導致大量并發數問題產生的原因大致包括:
(1)客戶端連接Connection使用完未關閉,下次使用建立新的連接Connection。
(2)客戶端會話Session使用完未關閉,下次使用建立新的會話Session。
(3)客戶端連接采用連接池技術(Pooled Connection)時,當應用廠家眾多時如超過數百家,可能會導致連接資源耗盡。
(4)客戶端發送未使用隊列,導致JVM溢出,導致新的Connection無法建立等情況。
本節從ActiveMQ大量并發連接數下由于客戶端連接不合理帶來的問題開始分析,比較了幾種連接數問題處理方法,最終提取并設計一種基于JMX規則庫的連接數優化方案。
2.1 幾種優化方法的比較
(1)顯式關閉連接和會話
顯式關閉的應用場景為客戶端能夠顯式關閉連接和會話,企業應用時尤其現代化信息系統建設涉及跨廠家、跨平臺,需要大量的應用業務數據集成。各廠家接口開發人員技術素質參差不齊,多廠家接口開發時間不一,尤其是測試不到位時,將會經常導致連接溢出現象,從而需要廠商接口進行進一步的優化。
ActiveMQ連接溢出將會對數據集成方帶來巨大應用壓力,某一廠家接口問題可能會導致全體數據的丟失,從而影響信息系統的整體使用。
此種辦法要求開發商嚴格按照標準技術進行開發,此方式對集成方來說屬于被動式連接處理,實際情況因為種種因素可能短期內不會有改善。
(2)Server端連接關閉
客戶端關閉方法是對技術的嚴格要求才能實現。Server端連接關閉由ActiveMQ服務應用廠商進行處理。Server端關閉的一般方法為,設計ActiveMQ 插件,利用ActiveMQ API提供的方法,獲得客戶端連接情況,并采取辦法進行關閉。
利用服務端ActiveMQ API關閉連接Connection,在很大程度上能夠解決連接未關閉的問題,而且此方法為主動式的關閉。
但是當連接出現死鎖時,服務端ActiveMQ API可能會失效。
2.2 優化方法的設計與實現
從2.1節兩種常用的解決情況分析來看,效果并不理想,甚至非常耗費聯合調試精力。本節采用另一種Java底層機制設計并實現ActiveMQ連接數及JVM占有量的監控與管理方法。
JMX(jdk1.5默認不開啟,jdk1.6默認開啟)是一個為應用程序、設備、系統等植入管理功能的框架。JMX可以跨越一系列異構操作系統平臺、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。任何基于JVM運行的應用程序在一定條件下,不做任何代碼編寫,即可使用JMX對JVM相關參數及方法進行監控與管理,如:關閉線程、查看堆棧量、查看進程內部類數量等。
ActiveMQ很好的實現了JMX協議,可以通過底層協議對其進行監控與管理。
(1)設計
基于JMX的ActiveMQ連接數優化的設計,主要包括:連接客戶端管理規則庫、ActiveMQ監控參數、監控處理方案等設計。

圖1 監控示意圖
①連接客戶端管理規則庫
必須的定義:客戶端連接源(IP)、每個連接源最大連接數、處理規則、連接對象最近一次執行時間、日志記錄規則等內容。
客戶端連接源用于確保連接ActiveMQ服務中心的連接對象處于授權狀態,并且授權可建立的最大的連接數,如機器A最大可建立10個連接,機器B最大可建立5個連接。當機器連接超過規則庫配置的最大連接數時,將會按照處理規則處理連接對象,如通過JMX技術手段,強制中斷該機器的所有連接對象等。
②ActiveMQ監控參數
監控參數:當前連接數、當前隊列堆積數、JVM內存信息。監控參數用于輔助查看當前ActiveMQ運行狀態,當出現指標偏離正常現象時,可以為處理規則提供一定的處理參考依據。比如當前連接數超過ActiveMQ警戒值時,通知處理規則進行強制處理當前所有連接對象,如中斷長時間未執行的連接對象。
③監控處理方案
處理規則庫一次性初始化加載,對ActiveMQ以心跳時間片輪詢方式定期監控其連接狀態,當異常時,利用規則庫進行處理。
(2)實現
根據規則配置庫,當出現連接異常時,如超過機器授權最大連接數時或超過ActiveMQ警戒值時,對ActiveMQ并發連接進行規則處理,下面是獲取連接數以及強制關閉連接客戶端的偽代碼。
①查詢當前所有連接對象

②強制停止連接對象

ActiveMQ是Apache旗下一款JMS工具,支持.NET、C++、Java等多種訪問方式,在企業級系統中大量應用,又因其實時性高,數據指標接收速度快,取得了良好業績。但當涉及數百家單位、而且客戶端連接不規范等因素時,會導致中心ActiveMQ服務阻塞而宕掉。本文通過以JMX的基礎技術,利用規則管理庫的思想,通過底層技術層面與業務規則相結合的手段,保障ActiveMQ中心在連接Connection問題下能夠長期穩定的運行,保障監控數據的順利接收。與此同時,本文的設計思路可為其他Java應用提供了一個良好的參考與借鑒。
另外,本文僅對并發連接數及相關的狀態做了一定研究與實驗,后續需要進一步對其他參數進行研究,爭取實現ActiveMQ全方位管理,達到更好的應用效果。
[1]Sun Mierosystems.Java Message Service Specifi ca-tion. http://java.sun.com/Products/ims.
[2]Apache ActiveMQ.http://activemq.apache.org.
[3]邱云.基于JMS的信息發布平臺的研究與實現[D].電子科技大學,2005.
[4]汪紅兵,佘春東,范植華,李磊,徐帆江.基于JMS的數據推送系統的設計與實現[J].計算機應用,2005.
[5]彭珍,曾廣周.基于JMS規范的群組通信中間件的研究[J].計算機工程與設計,2005.
[6]張帆.基于JMS的消息中間件的設計[D].武漢理工大學,2007.
[7]戴俊.基于ActiveMQ的異步消息總線的設計與實現[J].計算機系統應用,2010.
[8]李英芳.基于網絡報稅系統的消息隊列中間件的研究與設計[D].西安電子科技大學,2006.