霍長娟1,孫洪平2
?。?. 中國航空結(jié)算有限責(zé)任公司,北京 100028;2. 北京高陽金信信息技術(shù)有限公司,北京 100050)
摘要:主要介紹了一款基于消息通信的中間件軟件——The Cocklebur Network,即Tcn中間件的設(shè)計與實現(xiàn)。該系統(tǒng)具有以下特點:多進(jìn)程模型、預(yù)先創(chuàng)建子進(jìn)程機制,提高系統(tǒng)響應(yīng)速度;編程API簡單易用,都是圍繞Tcn軟件中專有的協(xié)議——Tcn協(xié)議展開,可運用標(biāo)準(zhǔn)的C語言庫函數(shù)與頭文件進(jìn)行各種應(yīng)用服務(wù)的開發(fā);Tcn設(shè)計并實現(xiàn)了通過動態(tài)庫與靜態(tài)鏈接兩種方式加載用戶服務(wù);同時此款軟件還支持文件傳輸、負(fù)載均衡等功能。經(jīng)過LoadRunner測試,該軟件有較好的性能,可以滿足大多數(shù)企業(yè)需要。
關(guān)鍵詞:Tcn;多進(jìn)程模型;Tcn協(xié)議;LoadRunner
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:ADOI: 10.19358/j.issn.1674-7720.2017.05.005
引用格式:霍長娟,孫洪平.Tcn中間件系統(tǒng)的設(shè)計與實現(xiàn)[J].微型機與應(yīng)用,2017,36(5):14-17,20.
0引言
中間件是分布式系統(tǒng)中的一層支撐軟件,它位于操作系統(tǒng)和應(yīng)用程序之間,負(fù)責(zé)對應(yīng)用程序及開發(fā)人員屏蔽系統(tǒng)中硬件、網(wǎng)絡(luò)、操作系統(tǒng)和編程語言等方面的異構(gòu)性并向他們提供統(tǒng)一的運行平臺和友好的開發(fā)環(huán)境。目前主流的中間件有Weblogic、Tuxedo、Websphere等,這些中間件都擁有各自的應(yīng)用領(lǐng)域。本文主要介紹一款基于消息通信的中間件軟件(The Cocklebur Network,Tcn),即Tcn中間件的設(shè)計與實現(xiàn),在保持屏蔽各種異構(gòu)性功能的基礎(chǔ)上,它的設(shè)計與實現(xiàn)又有自身的特點,由于Tcn涉及的模塊較多,本文將從多進(jìn)程模型[12]、用戶服務(wù)加載兩方面內(nèi)容進(jìn)行重點介紹,最后給出測試結(jié)論。
1系統(tǒng)架構(gòu)
Tcn中間件屬于消息通信中間件,完全結(jié)合實踐設(shè)計,擴展性好,易于使用。下面以銀行取款案例說明Tcn的架構(gòu)設(shè)計,如圖1所示,客戶在柜臺客戶端(這里稱為Tcn Client)發(fā)起取款請求,Tcn Client通過Tcn協(xié)議[3] 與服務(wù)器(這里稱為Tcn Server)進(jìn)行通信,在Tcn Server中,管理進(jìn)程Tcnd負(fù)責(zé)管理整個Tcn Server,是整個系統(tǒng)的中樞,工作進(jìn)程Tcnw負(fù)責(zé)響應(yīng)客戶端的請求,并根據(jù)配置文件等信息調(diào)用與之對應(yīng)的取款服務(wù)(這里稱為Service),這就是取款業(yè)務(wù)在Tcn中間件中的工作流程,另外,Tcn Client端的取款請求以及供Tcnw調(diào)用的取款Sevice都是基于Tcn編程接口進(jìn)行開發(fā)的。
2軟件說明
Tcn軟件主要由運行系統(tǒng)與開發(fā)系統(tǒng)組成。運行系統(tǒng)作為整個系統(tǒng)的中樞,控制著所有資源的申請、回收、釋放,調(diào)度系統(tǒng)中的全部應(yīng)用服務(wù)。開發(fā)系統(tǒng)提供C語言的庫函數(shù)與頭文件,供用戶開發(fā)應(yīng)用程序。
2.1產(chǎn)品目錄結(jié)構(gòu)
Tcn軟件假定安裝在AIX環(huán)境中/home/tcn目錄下,產(chǎn)品的目錄結(jié)構(gòu)如下:
/home/tcn/bin//執(zhí)行文件存放位置
/home/tcn/inc//開發(fā)環(huán)境頭文件
/home/tcn/lib//開發(fā)環(huán)境函數(shù)庫
/home/tcn/cfg//配置文件與重建Tcn模版存放位置
/home/tcn/cfg/app.conf//配置文件模版
/home/tcn/cfg/tcn.mk//重建Tcn的腳本模版
/home/tcn/sample//用戶服務(wù)例子
2.2運行系統(tǒng)組成
運行系統(tǒng)由5部分組成:核心進(jìn)程、管理工具、配置文件、日志文件、環(huán)境變量。
(1)核心進(jìn)程:整個系統(tǒng)的運行關(guān)鍵部分。
tcnd:負(fù)責(zé)對整個系統(tǒng)進(jìn)行監(jiān)控管理的守護(hù)進(jìn)程。
tcnw:負(fù)責(zé)接受客戶端訪問、調(diào)用服務(wù)、返回處理結(jié)果的進(jìn)程。
tcnlogd:負(fù)責(zé)登記系統(tǒng)日志。
(2)管理工具
tcnx:用于啟動、關(guān)閉、重啟Tcn系統(tǒng),檢查運行狀態(tài),檢查配置文件語法。
tcnr:熱重啟腳本,先檢查配置文件語法,然后發(fā)送重啟信號。
tcns:檢查Tcn系統(tǒng)是否為運行的腳本。
tcnping:用于測試服務(wù)器節(jié)點是否可以連通。
tcnas:用于監(jiān)控服務(wù)器運行狀態(tài)等信息。
(3)配置文件:整個tcn系統(tǒng)運行的依據(jù)。
(4)日志文件:記錄系統(tǒng)運行時的錯誤、警告、提示等信息。
(5)環(huán)境變量:Tcn的運行需要設(shè)置2個環(huán)境變量TCN_CONFIG、PATH。
TCN_CONFIG:設(shè)置Tcn系統(tǒng)的配置文件路徑。
PATH:將Tcn可執(zhí)行文件目錄加入到PATH環(huán)境變量中,以便Tcn的管理工具可以通過PATH查找到。
2.3開發(fā)系統(tǒng)組成
Tcn開發(fā)系統(tǒng)由編程頭文件與函數(shù)庫組成。
(1)頭文件
tpdi.h:用戶編程API的頭文件。
tpft.h:用于傳輸文件的編程頭文件。
(2)函數(shù)庫
libtpdi.a:用戶編程API的函數(shù)庫。
3多進(jìn)程模型
3.1多進(jìn)程模型機制
整個Tcn Server通過多進(jìn)程模型機制對外提供服務(wù),設(shè)計多進(jìn)程模型的目的是為了提高響應(yīng)速度和系統(tǒng)整體運行效率并達(dá)到無縫重啟。所謂多進(jìn)程模型就是系統(tǒng)中存在兩種進(jìn)程,如圖2所示。一種是對外提供服務(wù)的進(jìn)程worker process,此類進(jìn)程用于響應(yīng)客戶端請求并調(diào)用相應(yīng)的服務(wù);另一種進(jìn)程就是預(yù)先創(chuàng)建的子進(jìn)程(這里稱之為prefork worker process),時刻處于ready狀態(tài),準(zhǔn)備成為worker process。為什么多進(jìn)程模型機制能提高系統(tǒng)的響應(yīng)速度?在傳統(tǒng)中間件系統(tǒng)中,當(dāng)服務(wù)連接請求到達(dá)之后,fork函數(shù)會為服務(wù)連接請求創(chuàng)建子進(jìn)程,并分配相應(yīng)資源,進(jìn)而對外提供服務(wù),而在Tcn系統(tǒng)中,系統(tǒng)啟動之初,管理進(jìn)程Tcnd就根據(jù)配置文件的參數(shù)設(shè)置預(yù)先創(chuàng)建N個子進(jìn)程(prefork worker process)等待用戶服務(wù)請求,這些子進(jìn)程一直處于ready狀態(tài),當(dāng)用戶服務(wù)請求到達(dá)之后,直接對外提供服務(wù),而不需要fork函數(shù)再創(chuàng)建子進(jìn)程,所以很顯然能提高工作效率。
3.2創(chuàng)建、回收進(jìn)程
如何保證預(yù)先創(chuàng)建的子進(jìn)程個數(shù)既能滿足對外提供服務(wù)又不會造成資源浪費?如圖2所示,在多進(jìn)程模型中,完成這種預(yù)先創(chuàng)建的機制主要涉及3個活動:fork創(chuàng)建子進(jìn)程、reclaim回收進(jìn)程、布告板(bulletin board)信息的維護(hù)。也就是說,無論創(chuàng)建還是回收子進(jìn)程都是以布告板信息為依據(jù)的,因為布告板中記錄著系統(tǒng)當(dāng)前的worker process的個數(shù),目前處于busy、ready還是idle狀態(tài)等信息,管理進(jìn)程Tcnd就是根據(jù)這些信息進(jìn)行動態(tài)創(chuàng)建回收子進(jìn)程,進(jìn)而保證資源平衡。
3.3配置文件中的指令
配置文件是Tcn系統(tǒng)啟動、重啟的依據(jù),通過修改配置文件,對Tcn系統(tǒng)進(jìn)行功能裁剪。配置文件提供多達(dá)40條指令,這些指令控制著資源的申請、進(jìn)程數(shù)量、監(jiān)聽端口、負(fù)載均衡、增加主機訪問控制、導(dǎo)出用戶服務(wù)等。在多進(jìn)程模型中,有兩個指令發(fā)揮重要作用:
(1)MinfreeDaemons:最小空閑子進(jìn)程數(shù)量,默認(rèn)值為5。
?。?)MaxfreeDaemons:最大空閑子進(jìn)程數(shù)量,默認(rèn)值為10。
Tcn啟動之初,管理進(jìn)程會根據(jù)配置文件預(yù)先創(chuàng)建N個子進(jìn)程,即N個prefork worker process,N設(shè)置為大于1的整數(shù),后續(xù)的創(chuàng)建與回收主要以當(dāng)前負(fù)載為基準(zhǔn),管理進(jìn)程時刻關(guān)注著布告板(bulletin board)中的worker進(jìn)程信息,查看當(dāng)前的負(fù)載情況,同時根據(jù)MinfreeDaemons和MaxfreeDaemons的值來維護(hù)prefork worker process的個數(shù)進(jìn)行資源的平衡。
4用戶服務(wù)加載
用戶服務(wù)加載主要是指Tcn系統(tǒng)如何通過接口與用戶服務(wù)程序進(jìn)行連接。Tcn設(shè)計并實現(xiàn)出通過動態(tài)庫[4] 與靜態(tài)鏈接兩種方式加載用戶服務(wù)程序的方法,相比其他中間件,大大提高了軟件的靈活性,方便開發(fā)人員使用。
4.1靜態(tài)鏈接
像大多數(shù)中間件一樣,Tcn提供靜態(tài)鏈接的方式加載用戶服務(wù)程序。所謂靜態(tài)鏈接,在Tcn中就是指用戶服務(wù)程序不被編譯成動態(tài)庫文件,而是通過服務(wù)程序源文件重建成Tcn的工作進(jìn)程——Tcnw來實現(xiàn),當(dāng)客戶端發(fā)起服務(wù)請求時,管理進(jìn)程Tcnd直接分配Tcnw進(jìn)程,調(diào)用相應(yīng)服務(wù),響應(yīng)請求。目前大多數(shù)中間件都是這種加載方式。靜態(tài)鏈接的方式最大的缺點就是在更新服務(wù)時必須停止系統(tǒng)。
4.2動態(tài)庫
Tcn除提供靜態(tài)鏈接外,還提供另外一種方式加載用戶服務(wù),即動態(tài)庫加載。所謂動態(tài)庫加載就是用戶服務(wù)程序被編譯成動態(tài)庫文件,同時用戶服務(wù)程序與動態(tài)庫文件的關(guān)系(即哪些用戶服務(wù)程序被編譯成哪個動態(tài)庫文件)記錄到配置文件中,Tcn啟動時,根據(jù)配置文件加載動態(tài)庫到系統(tǒng)中,同時建立一個哈希列表,記錄用戶服務(wù)程序與動態(tài)庫文件之間的關(guān)系。如圖3所示,當(dāng)客戶端服務(wù)請求到達(dá)之后,會話句柄分析服務(wù)請求(request)是否符合Tcn協(xié)議以及語法語義要求,如果符合,進(jìn)一步分析出需要調(diào)用的服務(wù)名,然后去哈希表中尋找該服務(wù)入口,根據(jù)指針指向調(diào)用相應(yīng)的服務(wù),完成此次請求。
通過動態(tài)庫加載用戶服務(wù)程序可以實現(xiàn)在不停止系統(tǒng)運行的情況下通過熱啟動的方式來變更服務(wù)。例如,當(dāng)出現(xiàn)取款服務(wù)需要緊急變更而系統(tǒng)中的取款服務(wù)又沒有運行(run)完時,就需要動態(tài)庫加載。Tcn是這樣解決的,保持系統(tǒng)中的取款服務(wù)繼續(xù)運行,修改取款服務(wù)程序源文件(由于取款服務(wù)源文件之前已經(jīng)被編譯成動態(tài)庫文件,目前系統(tǒng)中取款服務(wù)是通過調(diào)用動態(tài)庫加載的,與取款服務(wù)源程序文件已經(jīng)沒有關(guān)系,因此這時可以修改取款服務(wù)源文件),修改完源文件后,再編譯成動態(tài)庫文件,進(jìn)而把原動態(tài)庫文件替換掉即可,最后通過熱啟動Tcn,就可以根據(jù)配置文件重新加載新的服務(wù)。在整個過程中,系統(tǒng)中舊有的取款服務(wù)一直處于running狀態(tài),直到結(jié)束,這就是通過加載動態(tài)庫方式,不需要重啟機器就可以變更服務(wù)的過程。
動態(tài)庫加載服務(wù)的方式大大提高了軟件的靈活性,尤其在要求不能宕機的實際生產(chǎn)業(yè)務(wù)中,將體現(xiàn)出其重要作用。
5測試結(jié)果
為了證明Tcn產(chǎn)品的性能及穩(wěn)定性,確保其高吞吐率及在高并發(fā)環(huán)境中的持續(xù)穩(wěn)定運行,針對Tcn系統(tǒng)進(jìn)行了壓力測試。本次測試的范圍,選取foo服務(wù)進(jìn)行測試(服務(wù)foo就是接收來自客戶端發(fā)送的字符串,然后應(yīng)答相同的字符串)。在性能測試過程中,測試Tcn系統(tǒng)的并發(fā)能力和平均響應(yīng)時間。在負(fù)載均衡測試過程中模擬關(guān)閉一個負(fù)載節(jié)點,能否自動將請求轉(zhuǎn)發(fā)至其他的節(jié)點。
以性能測試為例,經(jīng)過10 h的測試,成功率為100%,如表1所示。通過分析測試結(jié)果,平均響應(yīng)時間都在毫秒級,從資源監(jiān)控的結(jié)果圖(圖4~圖9)中可以看出,CPU、內(nèi)存、磁盤I/O均消耗很少,網(wǎng)絡(luò)I/O相對較為繁忙。因此在較高的TPS情況下,Tcn服務(wù)器自身消耗較少的系統(tǒng)資源。
在測試結(jié)果中,短鏈接的TPS遠(yuǎn)遠(yuǎn)低于長鏈接的TPS,短鏈接的平均響應(yīng)時間也高于長鏈接。長鏈接能大幅提升系統(tǒng)整體性能,但是長鏈接在長時間的空閑后,網(wǎng)絡(luò)鏈接依然存在,無法收發(fā)報文,通常的解決辦法是定時發(fā)送探測報文;另外長鏈接也不利于實現(xiàn)負(fù)載均衡。所以Tcn服務(wù)器實現(xiàn)一定請求次數(shù)的長鏈接后就會斷開鏈接,這樣既能保留長鏈接的優(yōu)點,也利于實現(xiàn)負(fù)載均衡。在負(fù)載均衡測試中,模擬關(guān)閉一個負(fù)載節(jié)點,在負(fù)載節(jié)點切換過程中,并未對代理服務(wù)器的資源占用造成較大幅度變動。以下給出短鏈接的測試結(jié)果:
VUs: LoadRunner中的虛擬用戶數(shù),模擬客戶端的數(shù)量。
6結(jié)論
本文概要介紹了Tcn軟件的概念及基本功能,結(jié)合其特點,重點描述了多進(jìn)程模型機制的原理、實現(xiàn),用戶加載服務(wù)的兩種方法。最后給出了利用LoadRunner進(jìn)行性能及壓力測試的測試報告,證明Tcn系統(tǒng)在高并發(fā)環(huán)境中能保持高吞吐率并且持續(xù)穩(wěn)定運行。
參考文獻(xiàn)
?。?] STEVENS W R.UNIX 網(wǎng)絡(luò)編程[M].楊繼張,譯. 北京:人民郵電出版社,2009.
?。?] STEVENS W R.TCP/IP詳解[M].范建華,譯.北京:機械工業(yè)出版社,2000.
?。?] SURHONE L M, TENNOE M T, HENSSONOW S F. External data representation[M].Betascript Publishing,2010.