魏文 鐘毅 馬欣欣 謝成宸
中國(guó)電子檢驗(yàn)檢疫主干系統(tǒng)(以下簡(jiǎn)稱(chēng)e-CIQ主干系統(tǒng))是基于全國(guó)大集中要求設(shè)計(jì)的全新核心業(yè)務(wù)系統(tǒng),它依托在北京建設(shè)的亦莊、東壩雙活數(shù)據(jù)中心,實(shí)現(xiàn)了全國(guó)大集中條件下應(yīng)用可用性99.99%的設(shè)計(jì)要求。而用戶Session會(huì)話的跨數(shù)據(jù)中心集群的安全、快速、可靠共享管理,是確保雙活順利實(shí)現(xiàn)的關(guān)鍵。為此,e-CIQ主干系統(tǒng)運(yùn)用跨WAS集群的Session,選用了業(yè)界領(lǐng)先的IBM WAS SESSION高速緩存服務(wù)中心(WebSphere eXtreme Scale,WXS)方案來(lái)實(shí)現(xiàn)應(yīng)用集群的SESSION共享管理工作。
通過(guò)IBM、官方文檔及售前工程師的介紹,WXS高速緩存服務(wù)中心是將原有多節(jié)點(diǎn)的Session會(huì)話共享管理工作通過(guò)專(zhuān)用的獨(dú)立HIS/WAS/WXS服務(wù)器(標(biāo)準(zhǔn)最小部署至少18個(gè)節(jié)點(diǎn))實(shí)現(xiàn)跨集群Session會(huì)話內(nèi)容共享管理,對(duì)Session的管理依然遵循JavaEE技術(shù)標(biāo)準(zhǔn),包括客戶端與服務(wù)器端Session的保存機(jī)制,均采用JSessionID來(lái)保持Session的內(nèi)容,這也是JavaEE標(biāo)準(zhǔn)的實(shí)現(xiàn)方式。
在e-CIQ主干系統(tǒng)北京雙活數(shù)據(jù)中心機(jī)房測(cè)試環(huán)境中,硬件環(huán)境集成商已完成WAS集群和Session高速緩存服務(wù)中心搭建,同時(shí)在雙活中心測(cè)試環(huán)境也部署了e-CIQ主干系統(tǒng)應(yīng)用。但是經(jīng)過(guò)第三方測(cè)試,e-CIQ項(xiàng)目應(yīng)用集群Session信息無(wú)法共享,在客戶端連接時(shí)會(huì)出現(xiàn)Session丟失的情況,客戶端會(huì)提示“服務(wù)器已經(jīng)重啟,您的登錄信息已經(jīng)失效,請(qǐng)重新登錄”并報(bào)錯(cuò)。如圖1所示:
一、背景情況
e-CIQ主干系統(tǒng)雙活中心WAS集群的部署結(jié)構(gòu)適合于應(yīng)用業(yè)務(wù)雙活類(lèi)型,具備軟件業(yè)務(wù)應(yīng)用層面實(shí)現(xiàn)業(yè)務(wù)雙活、多路徑訪問(wèn)以及負(fù)載均衡,單中心基于VMware vSphere HA和應(yīng)用集群(中間件集群),雙活數(shù)據(jù)中心之間采用應(yīng)用軟件1∶1部署,雙活中心之間采用Session高速緩存服務(wù)中心(WXS)集中管理緩存,保證雙活數(shù)據(jù)中心內(nèi)的單個(gè)中心全站點(diǎn)在宕機(jī)極端情況下,作為雙活數(shù)據(jù)中心整體仍然能夠?qū)ν獬掷m(xù)提供業(yè)務(wù)服務(wù),如圖2所示:
基于IBM官方提供的標(biāo)準(zhǔn)測(cè)試WAR包在WAS環(huán)境下的Session高速緩存服務(wù)中心下,可以實(shí)現(xiàn)集群Session集中共享。但是經(jīng)第三方測(cè)試反饋,e-CIQ主干系統(tǒng)應(yīng)用集群Session共享存在問(wèn)題,出現(xiàn)Session頻繁丟失的情況。
筆者初步分析問(wèn)題后,發(fā)現(xiàn)由e-CIQ主干系統(tǒng)創(chuàng)建的Session會(huì)話信息并未成功存放到WAS集群下的WXS Session高速緩存服務(wù)器中,導(dǎo)致e-CIQ主干系統(tǒng)Session會(huì)話信息無(wú)法共享。筆者經(jīng)過(guò)進(jìn)一步分析,了解到e-CIQ主干系統(tǒng)基于中國(guó)電子檢驗(yàn)檢疫統(tǒng)一開(kāi)發(fā)平臺(tái)(以下簡(jiǎn)稱(chēng)UIP平臺(tái))進(jìn)行開(kāi)發(fā)的,軟件開(kāi)發(fā)商遵循標(biāo)準(zhǔn)的開(kāi)發(fā)平臺(tái)規(guī)范,對(duì)業(yè)務(wù)邏輯進(jìn)行編碼實(shí)現(xiàn),底層資源、包括Session的管理,均在UIP平臺(tái)中實(shí)現(xiàn),業(yè)務(wù)應(yīng)用代碼層面并沒(méi)有對(duì)Session進(jìn)行處理。
二、故障排查
根據(jù)IBM官方技術(shù)支持反饋,WXS作為IBM提供的分布式高速緩存平臺(tái),用于存儲(chǔ)服務(wù)器端的會(huì)話信息,由容器服務(wù)器和目錄服務(wù)器組成,目錄服務(wù)器主要用于索引,容器服務(wù)器才是真正存放會(huì)話信息的服務(wù)器。多臺(tái)服務(wù)器把會(huì)話信息存放在容器服務(wù)器內(nèi),用戶讀取信息時(shí),需要從目錄服務(wù)器查詢(xún)會(huì)話信息的容器服務(wù)器,查詢(xún)完成后再?gòu)南鄳?yīng)的容器服務(wù)器獲取會(huì)話信息,就能實(shí)現(xiàn)會(huì)話信息的共享了。也就是說(shuō),為了實(shí)現(xiàn)會(huì)話信息共享,索引和內(nèi)容兩個(gè)關(guān)鍵點(diǎn)缺一不可。
為此,在北京雙活數(shù)據(jù)中心測(cè)試WAS集群中,筆者和開(kāi)發(fā)人員首先在服務(wù)端環(huán)境中開(kāi)發(fā)了一個(gè)JSP頁(yè)面,進(jìn)行抓包分析測(cè)試。在使用WXS抓包套件條件下,通過(guò)對(duì)HTTP請(qǐng)求抓包,發(fā)現(xiàn)兩次COOKIE項(xiàng)值與未使用WXS的情況存在差異。具體表現(xiàn)為:使用WXS后JSessionID經(jīng)過(guò)加工處理,增加了標(biāo)記段,同時(shí)多傳回標(biāo)記為IBMID的COOKIE值。抓包測(cè)試結(jié)果如圖3、圖4所示。
筆者經(jīng)排查發(fā)現(xiàn),IBM WAS 在實(shí)現(xiàn)Session共享時(shí),會(huì)對(duì)JSessionID 進(jìn)行相關(guān)處理,包括修改JSessionID的值。JSessionID本身是用來(lái)存放SESSION ID的,IBM WAS 會(huì)在Session ID 前增加4位字符,在Session ID 結(jié)尾處增加一個(gè)以“:”(英文冒號(hào))開(kāi)始、以“;”(英文分號(hào))結(jié)束的字符串,如圖5所示:
此外,富客戶端每次發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí)還需包含IBMID參數(shù),IBMID參數(shù)的值是以SESSIONID開(kāi)頭,然后在結(jié)尾處增加一個(gè)以“:”( 英文冒號(hào))開(kāi)頭的字符串。每次請(qǐng)求時(shí),必須包含這兩個(gè)參數(shù),并且要嚴(yán)格遵守上述格式,否則就會(huì)出現(xiàn)Session丟失故障提示,如圖6所示:
至此,筆者猜測(cè)問(wèn)題在于IBM WAS在實(shí)現(xiàn)Session共享時(shí),并未遵循JavaEE Web技術(shù)標(biāo)準(zhǔn)對(duì)SessionID 進(jìn)行相關(guān)修改。之后,相關(guān)的分析也佐證了筆者的猜測(cè)。
從操作性、安全性及效率性來(lái)考量,e-CIQ主干系統(tǒng)客戶端使用了Java AWT(Abstract Window ToolKit)的Swing封裝套件,基于UIP-RCP(Rich Client Platform)開(kāi)發(fā)的富客戶端。作為對(duì)比,IBM官方標(biāo)準(zhǔn)測(cè)試WAR包是基于B/S模式實(shí)現(xiàn)的Web頁(yè)面跨集群Session會(huì)話共享管理。瀏覽器和富客戶端對(duì)Session的管理機(jī)制存在差異,主流瀏覽器回傳的是整個(gè)Session字符串,而富客戶端按照J(rèn)ava標(biāo)準(zhǔn)僅回傳JSessionID值。這就解釋了IBM官方測(cè)試WAR包緩存共享測(cè)試通過(guò)的原因。
進(jìn)一步深入查詢(xún)相關(guān)技術(shù)文檔后,筆者發(fā)現(xiàn)IBMID由WXS負(fù)責(zé)跟蹤,其與JSessionID的格式略有不同。JSessionID的格式為:
三、解決方案
明確問(wèn)題故障節(jié)點(diǎn)后,筆者和技術(shù)人員就開(kāi)始著手排除故障,主要是針對(duì)UIP v4.4平臺(tái)中rcp-core.jar進(jìn)行修改。修改工作主要包括三處,分別是:
第一,對(duì)ClientSession類(lèi)進(jìn)行修改,增加IBMID成員變量,提供getter和setter方法,用于將IBMID存儲(chǔ)以及搜索WXS中的Session會(huì)話信息。如圖7所示:
第二,修改HttpClientProxy類(lèi),對(duì)IBMID進(jìn)行判斷,針對(duì)存儲(chǔ)在Cookie中的IBMID,在每次發(fā)送request時(shí)候,同時(shí)將IBMID也一起發(fā)送。如圖8所示:
第三,修改HttpStreamProxy類(lèi),生成符合WXS環(huán)境下共享緩存所需的IBM JSessionID和IBMID格式SessionID值串。如圖9所示:
四、工作小結(jié)
IBM WAS系列產(chǎn)品作為行業(yè)龍頭,憑借操作系統(tǒng)(AIX)+中間件(WAS)+數(shù)據(jù)庫(kù)(DB2)的頗具殺傷力的組合,其中間件產(chǎn)品標(biāo)準(zhǔn)基本上與行業(yè)標(biāo)準(zhǔn)、技術(shù)標(biāo)準(zhǔn)畫(huà)等號(hào)。
令人信任的產(chǎn)品不能盲從于權(quán)威,尤其是在細(xì)節(jié)方面。WAS產(chǎn)品為了實(shí)現(xiàn)自身更多的獨(dú)有特性,犧牲了不少兼容性,并對(duì)配置提出了更高的要求,值得大家在項(xiàng)目管理工作中更加注意。
(作者單位:江西出入境檢驗(yàn)檢疫局)