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