徐萌飛 王軍玲
( 武漢船用電力推進(jìn)裝置研究所,武漢 430064 )
隨著大型企業(yè)自身規(guī)模不斷擴(kuò)大以及企業(yè)間并購(gòu)重組的增多,需要面向客戶提供數(shù)據(jù)服務(wù)的企業(yè)各部門,其原有的設(shè)備和通訊接口也越來(lái)越多樣且復(fù)雜,對(duì)數(shù)據(jù)通訊和數(shù)據(jù)處理也提出了更高的要求。而且,在業(yè)務(wù)應(yīng)用中,客戶接入類型多種多樣(例如2G,3G,internet等),通訊接入方式多種多樣(包括有線,無(wú)線),接口協(xié)議也多種多樣(例如CAMEAL,HTTP,SOAP等),所以需要一種行之有效的架構(gòu)來(lái)支持不同客戶獲得后臺(tái)統(tǒng)一的業(yè)務(wù)服務(wù)感知。同時(shí),在客戶端請(qǐng)求訪問(wèn)量過(guò)大的情況下,如何實(shí)現(xiàn)整個(gè)系統(tǒng)高效且平穩(wěn)的過(guò)負(fù)荷控制,也成為一個(gè)亟待解決的問(wèn)題。
業(yè)務(wù)系統(tǒng)判斷是否達(dá)到過(guò)負(fù)荷狀態(tài)一般采用資源使用率評(píng)估的方法,即判斷當(dāng)前系統(tǒng)已使用資源占可提供資源的百分比,在服務(wù)器和大型機(jī)系統(tǒng),常常以CPU使用率作為主要判斷依據(jù)(很多系統(tǒng)以CPU占用率達(dá)到80%開始實(shí)施過(guò)負(fù)荷控制),內(nèi)存和磁盤占用率等其他部分為輔助判斷依據(jù)。
系統(tǒng)過(guò)負(fù)荷控制包括以下幾個(gè)方面的需求:
當(dāng)系統(tǒng)達(dá)到臨界值時(shí),系統(tǒng)必須迅速做出反應(yīng),實(shí)施過(guò)負(fù)荷控制策略。因此,從系統(tǒng)檢測(cè)到負(fù)荷過(guò)重,到實(shí)施過(guò)負(fù)荷控制的部件動(dòng)作之間的時(shí)間間隔要盡可能短,信息傳遞的環(huán)節(jié)要盡可能少。
當(dāng)系統(tǒng)實(shí)施過(guò)負(fù)荷控制策略后,系統(tǒng)負(fù)荷要能在系統(tǒng)可承受的較短時(shí)間內(nèi)有效下降到正常工作范圍,如果不能達(dá)到這個(gè)目標(biāo)則系統(tǒng)存在崩潰的風(fēng)險(xiǎn)。一般很多系統(tǒng)采用停止對(duì)外部客戶新請(qǐng)求的響應(yīng),停止響應(yīng)的范圍越大,往往過(guò)負(fù)荷控制得越快,但對(duì)整個(gè)系統(tǒng)服務(wù)的客戶評(píng)價(jià)影響也越大。
過(guò)負(fù)荷控制意味著拒絕對(duì)部分外界用戶服務(wù),但并不意味著整個(gè)系統(tǒng)停止對(duì)所有外部客戶服務(wù),而是在保持系統(tǒng)額定負(fù)荷的用戶服務(wù)能力,只是拒絕超過(guò)負(fù)荷臨界的用戶請(qǐng)求。
過(guò)負(fù)荷控制策略實(shí)施后,由于停止了對(duì)客戶終端新請(qǐng)求的響應(yīng),系統(tǒng)負(fù)荷會(huì)下降。而一旦系統(tǒng)負(fù)荷降低到臨界值以下時(shí),后臺(tái)業(yè)務(wù)服務(wù)又要重新啟用對(duì)用戶終端的響應(yīng),系統(tǒng)負(fù)荷將再次上升,甚至可能再次超過(guò)臨界值,從而導(dǎo)致下一次過(guò)負(fù)荷控制。如此反復(fù),系統(tǒng)負(fù)荷存在波動(dòng),對(duì)整個(gè)業(yè)務(wù)的提供也存在不確定風(fēng)險(xiǎn),一般而言,波動(dòng)越小越好。很多系統(tǒng)要求波動(dòng)在5%以內(nèi)。
由于過(guò)負(fù)荷控制意味著在系統(tǒng)負(fù)荷未降低前要停止對(duì)部分用戶的響應(yīng)。其策略和業(yè)務(wù)特性相關(guān),而業(yè)務(wù)特性往往和客戶類型以及客戶請(qǐng)求的類型有關(guān)。例如,如果客戶劃分為一般用戶和高級(jí)用戶,則在過(guò)負(fù)荷的情況下,先停止對(duì)一般用戶的響應(yīng),保持對(duì)高級(jí)別用戶的服務(wù),在系統(tǒng)負(fù)荷還不斷上升的情況下,盡可能最后才停止對(duì)高級(jí)用戶的響應(yīng)。
上述需求在實(shí)現(xiàn)過(guò)程中,往往存在一定的矛盾關(guān)系,過(guò)分傾向?qū)崿F(xiàn)某部分需求,將導(dǎo)致其他需求的服務(wù)質(zhì)量降低,所以針對(duì)過(guò)負(fù)荷控制的架構(gòu)和算法上都需要深入研究。
前置機(jī)(Front-End system)是一種接入設(shè)備,最初應(yīng)用于銀行系統(tǒng),實(shí)現(xiàn)銀行傳統(tǒng)業(yè)務(wù)向外拓展而普遍采用的中間設(shè)備,其主要功能是網(wǎng)絡(luò)通信,報(bào)文認(rèn)證,交易數(shù)據(jù)轉(zhuǎn)換,管理和調(diào)度前臺(tái)發(fā)起的交易等。其功能等同于通訊領(lǐng)域用于收斂用戶的端局交換機(jī)。
在通訊領(lǐng)域,前置機(jī)成為提高系統(tǒng)吞吐效率,降低系統(tǒng)負(fù)荷的重要組成部分。它不僅僅實(shí)現(xiàn)對(duì)客戶服務(wù)請(qǐng)求的收斂節(jié)點(diǎn)功能,同時(shí)對(duì)不同類型的客戶接入通訊協(xié)議進(jìn)行格式轉(zhuǎn)換,將多樣性的數(shù)據(jù)請(qǐng)求格式轉(zhuǎn)化為統(tǒng)一的服務(wù)請(qǐng)求格式,發(fā)往后臺(tái)服務(wù)層。
前置機(jī)包括從客戶接入端到與后臺(tái)服務(wù)端通訊接口的軟件和硬件。如果企業(yè)采用了基于SOA(Service Oriented Architecture,SOA)的業(yè)務(wù)系統(tǒng)架構(gòu),那么前置機(jī)將可以直接和其核心組件-企業(yè)服務(wù)總線(Enterprise Service Bus,ESB)進(jìn)行對(duì)接。
本文提供一種基于腳本運(yùn)行的前置機(jī)的系統(tǒng)方案來(lái)實(shí)現(xiàn)前述的過(guò)負(fù)荷控制的業(yè)務(wù)目標(biāo)。和普通業(yè)務(wù)系統(tǒng)架構(gòu)相比,應(yīng)用前置機(jī)的系統(tǒng)進(jìn)行過(guò)負(fù)荷控制時(shí)具有更加高效靈活的特點(diǎn)。
下面將基于普通后臺(tái)業(yè)務(wù)處理系統(tǒng)方案和基于前置機(jī)的接入方案進(jìn)行一個(gè)對(duì)比。
為多客戶服務(wù)的業(yè)務(wù)系統(tǒng)體系架構(gòu)圖,最普遍的是采用C/S架構(gòu),即客戶端/服務(wù)器模式,如下:使用此種架構(gòu)的系統(tǒng)在負(fù)荷較重的情況下,存在下列問(wèn)題:
圖1 多客戶端C/S體系結(jié)構(gòu)
1) 業(yè)務(wù)系統(tǒng)不僅僅要進(jìn)行業(yè)務(wù)數(shù)據(jù)處理,還需要負(fù)責(zé)和外部多個(gè)客戶終端進(jìn)行通訊的任務(wù),當(dāng)接入客戶很多的情況下,整個(gè)系統(tǒng)負(fù)荷很重。
2) 由于要支持多種類型的客戶端接入,后臺(tái)服務(wù)器要能夠提供多種協(xié)議接口,大大增加了后臺(tái)服務(wù)系統(tǒng)的復(fù)雜性。
3) 針對(duì)同一類型接口的用戶接入,系統(tǒng)一般采用單一的接口進(jìn)程進(jìn)行處理,一旦進(jìn)程崩潰,則所有此類型的用戶提交的服務(wù)請(qǐng)求將失敗。
4) 由于系統(tǒng)面向的是多個(gè)獨(dú)立用戶請(qǐng)求,所以過(guò)負(fù)荷控制策略一般單一。在系統(tǒng)達(dá)到負(fù)荷臨界點(diǎn)時(shí),系統(tǒng)進(jìn)行過(guò)負(fù)荷控制時(shí)會(huì)同時(shí)影響到外部大量同類型的客戶請(qǐng)求,系統(tǒng)產(chǎn)生大幅波動(dòng),降低穩(wěn)定性。
5) 系統(tǒng)對(duì)外部請(qǐng)求處理策略或過(guò)負(fù)荷控制策略發(fā)生變化時(shí),往往要重新加載或升級(jí)整個(gè)業(yè)務(wù)系統(tǒng)軟件,在升級(jí)過(guò)程中,將無(wú)法響應(yīng)客戶端請(qǐng)求,從而導(dǎo)致所有客戶端無(wú)法得到服務(wù),業(yè)務(wù)中斷。
為解決在滿負(fù)荷運(yùn)行情況下的過(guò)負(fù)荷控制,一些系統(tǒng)采用了的B/S三層架構(gòu),并在負(fù)荷分擔(dān)時(shí)采用了F2之類的負(fù)載均衡設(shè)備,其體系架構(gòu)圖如下:
圖2 多客戶端B/S體系結(jié)構(gòu)
應(yīng)用這種體系結(jié)構(gòu),采用了多服務(wù)器后臺(tái),使用如F2之類的負(fù)載均衡設(shè)備,根據(jù)各個(gè)后臺(tái)業(yè)務(wù)服務(wù)器自身的負(fù)荷來(lái)動(dòng)態(tài)選擇由哪個(gè)業(yè)務(wù)服務(wù)器對(duì)外提供服務(wù)。這種方式能夠部分解決問(wèn)題
(1),采用多后臺(tái)服務(wù)器則解決了問(wèn)題(3),但是,使用這種架構(gòu)在多種客戶終端接入時(shí)仍無(wú)法解決剩下的問(wèn)題(2)、(4)和(5)。
而且由于B/S架構(gòu)的天然限制,在沒有增加協(xié)議轉(zhuǎn)換部件的情況下,限制了接入的客戶終端類型。
最后此架構(gòu)存在的另一個(gè)矛盾仍然是業(yè)務(wù)處理和負(fù)荷控制的耦合性。由于負(fù)載均衡設(shè)備會(huì)根據(jù)后臺(tái)服務(wù)器的負(fù)荷,動(dòng)態(tài)分配客戶端的服務(wù)請(qǐng)求,如果后臺(tái)業(yè)務(wù)服務(wù)器的負(fù)荷控制策略不一致,則可能導(dǎo)致用戶獲得業(yè)務(wù)體驗(yàn)不一致。而如果后臺(tái)服務(wù)器采用一致的負(fù)荷控制策略,控制靈活性上又不足。
為解決前述問(wèn)題,可以采用下面的基于前置機(jī)的業(yè)務(wù)系統(tǒng)架構(gòu)。其簡(jiǎn)化體系如下:
圖3 采用前置機(jī)的C/S體系結(jié)構(gòu)
此體系架構(gòu)由后臺(tái)業(yè)務(wù)系統(tǒng),業(yè)務(wù)前置機(jī),業(yè)務(wù)前置機(jī)管理主機(jī)組成。后臺(tái)業(yè)務(wù)系統(tǒng)和圖1中的服務(wù)器一樣,一般為性能較強(qiáng)的業(yè)務(wù)服務(wù)器。前置機(jī)有多臺(tái)一般不需使用過(guò)高配置,很多系統(tǒng)的業(yè)務(wù)前置機(jī)可配置為輕量級(jí)的工作站甚至是工控機(jī)或PC。業(yè)務(wù)前置機(jī)的管理主機(jī)的配置可以更加簡(jiǎn)單。
不同類型的客戶終端可以根據(jù)其類型、其接口、甚至地域等分類,分別收斂到業(yè)務(wù)前置機(jī)上。由前置機(jī)處理通訊任務(wù)、協(xié)議轉(zhuǎn)換以及過(guò)負(fù)荷控制策略的實(shí)施,業(yè)務(wù)系統(tǒng)專注于后臺(tái)業(yè)務(wù)處理,實(shí)現(xiàn)了控制和業(yè)務(wù)的分離,解決了舊系統(tǒng)面臨的問(wèn)題(1)。
不同的前置機(jī)可以處理不同的外部協(xié)議接口,功能簡(jiǎn)化。業(yè)務(wù)前置機(jī)通過(guò)協(xié)議轉(zhuǎn)換,將接入的客戶端請(qǐng)求的協(xié)議轉(zhuǎn)化為業(yè)務(wù)系統(tǒng)統(tǒng)一的標(biāo)準(zhǔn)接口,大大降低了后臺(tái)業(yè)務(wù)系統(tǒng)接口處理的復(fù)雜性,解決了舊系統(tǒng)面臨的問(wèn)題(2)。而且各個(gè)前置機(jī)使用內(nèi)部統(tǒng)一協(xié)議和后臺(tái)業(yè)務(wù)系統(tǒng)進(jìn)行通訊,所以后臺(tái)業(yè)務(wù)系統(tǒng)啟動(dòng)的多個(gè)服務(wù)進(jìn)程對(duì)外的接口也可以統(tǒng)一,即使某個(gè)進(jìn)程因?yàn)榻┧蓝V狗?wù),其他進(jìn)程也可以接管僵死進(jìn)程的任務(wù),不影響外界用戶業(yè)務(wù)需求,從而解決了舊系統(tǒng)面臨的問(wèn)題(3)。為了進(jìn)一步保證系統(tǒng)的可靠性,還可以在前置機(jī)單元使用主-從雙機(jī)機(jī)制,這樣當(dāng)前置機(jī)單機(jī)出現(xiàn)問(wèn)題,備機(jī)立刻接替服務(wù),不會(huì)造成業(yè)務(wù)中斷。
由于不同類型的客戶請(qǐng)求可以分別收斂不同的前置機(jī),所以不同的前置機(jī)上可以配置不同的過(guò)負(fù)荷控制策略,而且可以根據(jù)業(yè)務(wù)需求,配置控制策略算法,實(shí)現(xiàn)系統(tǒng)穩(wěn)定調(diào)節(jié)。
前置機(jī)軟件使用基于腳本的應(yīng)用軟件,可以采用目前廣泛應(yīng)用的TCL框架或Python框架,將前置機(jī)的協(xié)議處理邏輯和負(fù)荷控制算法使用TCL腳本或者Python腳本實(shí)現(xiàn)。根據(jù)實(shí)現(xiàn)不同的負(fù)荷控制策略而采用不同的腳本程序,通過(guò)前置機(jī)管理主機(jī)將業(yè)務(wù)腳本動(dòng)態(tài)加載到前置機(jī)上,無(wú)需對(duì)后臺(tái)業(yè)務(wù)系統(tǒng)軟件進(jìn)行任何修改,非常方便靈活。在動(dòng)態(tài)加載的過(guò)程中,可以對(duì)多臺(tái)前置機(jī)做逐臺(tái)更新,只會(huì)短時(shí)間影響到被更新的前置機(jī)收斂的客戶接入,將對(duì)客戶的影響降到最低。如果前置機(jī)單元采用主-從雙機(jī),可以在更新完從機(jī)的控制腳本后實(shí)施主從切換,客戶受到的影響更加微乎其微。所以,能解決舊系統(tǒng)面臨的問(wèn)題(5)。
如果客戶將業(yè)務(wù)處理分散到多臺(tái)服務(wù)器上,只需要將前述圖2的體系架構(gòu)中,增加前置機(jī)部分,使前置機(jī)位于用戶和負(fù)載均衡設(shè)備之間即可,如下:
圖4 采用前置機(jī)的多客戶端業(yè)務(wù)系統(tǒng)結(jié)構(gòu)
使用這種系統(tǒng)架構(gòu),不僅僅包含了原有B/S體系結(jié)構(gòu)的優(yōu)點(diǎn)(如動(dòng)態(tài)負(fù)載分配,后臺(tái)業(yè)務(wù)服務(wù)器物理獨(dú)立,業(yè)務(wù)統(tǒng)一),解決了舊系統(tǒng)面臨的問(wèn)題,還大大擴(kuò)展了接入客戶端的種類,使其不僅僅局限于web browser。可參考前述模型中的分析,在此不多敘述。
近年來(lái),越來(lái)越多企業(yè)采用SOA(Service Oriented Architecture,面向服務(wù)的體系架構(gòu))來(lái)解決內(nèi)部跨部門之間的應(yīng)用集成問(wèn)題和數(shù)據(jù)交換問(wèn)題。在SOA架構(gòu)中,應(yīng)用ESB(Enterprise Service Bus,企業(yè)服務(wù)總線)作為核心組件。其基本的組成架構(gòu)如下:
圖5 采用ESB架構(gòu)
在基于SOA的體系結(jié)構(gòu)中,仍然可以采用前置機(jī)方案,布置在客戶業(yè)務(wù)終端之和ESB業(yè)務(wù)總線之間,對(duì)客戶請(qǐng)求進(jìn)行收斂,同樣簡(jiǎn)化了ESB實(shí)現(xiàn)的復(fù)雜程度(因?yàn)榍爸脵C(jī)進(jìn)行了協(xié)議統(tǒng)一轉(zhuǎn)換),而前置機(jī)控制主機(jī)可以作為應(yīng)用服務(wù)器的一員,通過(guò)ESB來(lái)管理各個(gè)前置機(jī)。如下所示:
圖6 采用ESB管理前置機(jī)結(jié)構(gòu)
下面以基于TCL框架的前置機(jī)為例,介紹前置機(jī)軟件實(shí)現(xiàn)機(jī)制。可以使用C或C++等的系統(tǒng)語(yǔ)言編制前置機(jī)軟件,在軟件中嵌入TCL解釋器,這樣應(yīng)用程序就可以解釋執(zhí)行TCL語(yǔ)言寫成的腳本語(yǔ)言。由于TCL本身是用C實(shí)現(xiàn)的,所以集成到這些系統(tǒng)語(yǔ)言編制的軟件中非常容易,在操作系統(tǒng)中安裝了TCL軟件框架后,在C/C++開發(fā)應(yīng)用軟件中,包含TCL的提供的頭文件,調(diào)用TCL的API函數(shù)即可。
前置機(jī)軟件,TCL解釋器及前置機(jī)管理主機(jī)軟件之間的關(guān)系如下:
圖7 TCL解釋器及前置機(jī)管理主機(jī)軟件關(guān)系
在整個(gè)軟件中,前置機(jī)軟件使用C/C++系統(tǒng)語(yǔ)言編寫完成的部分主要是與前置機(jī)管理主機(jī)通訊,執(zhí)行管理主機(jī)下達(dá)的對(duì)用戶接入進(jìn)行維護(hù)管理的指令,同時(shí)還響應(yīng)業(yè)務(wù)腳本加載,業(yè)務(wù)啟動(dòng)、停止等控制指令。TCL解釋器則負(fù)責(zé)解釋執(zhí)行業(yè)務(wù)腳本并輸出結(jié)果。
基于Python腳本框架的前置機(jī)軟件的實(shí)現(xiàn)也大同小異,也是將Python解釋器嵌入到應(yīng)用程序中,從而可以解釋執(zhí)行用Python語(yǔ)言寫成的腳本語(yǔ)言。嵌入是通過(guò)Python的C語(yǔ)言應(yīng)用程序編程接口(C API)來(lái)進(jìn)行的。
當(dāng)過(guò)負(fù)荷控制策略和協(xié)議轉(zhuǎn)換等業(yè)務(wù)處理邏輯在業(yè)務(wù)腳本中實(shí)現(xiàn)后,加載到前置機(jī)軟件運(yùn)行環(huán)境中,就可以由腳本解釋語(yǔ)言框架進(jìn)行解釋執(zhí)行,如果進(jìn)行了修改,腳本無(wú)需重新編譯,直接更新,非常方便靈活。在處理速度上,高效的解釋型腳本語(yǔ)言和編譯型語(yǔ)言速度也相差無(wú)幾。
使用前置機(jī)進(jìn)行過(guò)負(fù)荷控制策略時(shí),后臺(tái)業(yè)務(wù)系統(tǒng)并不根據(jù)自身的業(yè)務(wù)負(fù)荷情況來(lái)決定以何種方式應(yīng)答客戶終端的請(qǐng)求。因?yàn)閷?duì)后臺(tái)系統(tǒng)而言,最終用戶是透明的,所有的業(yè)務(wù)數(shù)據(jù)請(qǐng)求都來(lái)自前置機(jī)。所以正常運(yùn)行時(shí),后臺(tái)系統(tǒng)會(huì)不斷將自身的負(fù)荷狀態(tài)廣播給與其連接的所有前置機(jī),前置機(jī)則根據(jù)加載的業(yè)務(wù)腳本中過(guò)負(fù)荷控制的功能來(lái)決定如何處理。這樣的模式減少了后臺(tái)業(yè)務(wù)系統(tǒng)的開銷,縮短了整個(gè)系統(tǒng)對(duì)業(yè)務(wù)請(qǐng)求處理的路徑,提高了響應(yīng)速度。
當(dāng)業(yè)務(wù)系統(tǒng)逼近臨界點(diǎn)時(shí),前置機(jī)就會(huì)主動(dòng)拒絕新增的客戶端的服務(wù)請(qǐng)求,降低負(fù)荷,直到后臺(tái)業(yè)務(wù)系統(tǒng)恢復(fù)正常為止。由于拒絕客戶端的業(yè)務(wù)請(qǐng)求同樣會(huì)占用系統(tǒng)的開銷,所以將這種開銷放到前置機(jī)上,處理機(jī)制上充分體現(xiàn)了控制和業(yè)務(wù)相分離的思想。
在實(shí)際應(yīng)用系統(tǒng)中,即使采用最簡(jiǎn)單的負(fù)荷控制策略(1),就可以收到很好的控制效果,系統(tǒng)負(fù)荷曲線平滑無(wú)波動(dòng)。
前置機(jī)在面向多用戶提供服務(wù)的大型系統(tǒng)中發(fā)揮著重要的作用。將系統(tǒng)過(guò)負(fù)荷控制功能從后臺(tái)業(yè)務(wù)服務(wù)器中剝離出來(lái)放在前置機(jī)上,這種實(shí)現(xiàn)方式相對(duì)于以往的系統(tǒng)架構(gòu)而言,體現(xiàn)了控制和業(yè)務(wù)處理相分離的思想,能夠提高過(guò)負(fù)荷控制的及時(shí)性,有效性,部署的靈活性。通過(guò)對(duì)控制策略的算法設(shè)計(jì),能夠提高整個(gè)系統(tǒng)在負(fù)載臨界點(diǎn)時(shí)提供業(yè)務(wù)服務(wù)的穩(wěn)定性。不論是最初的 C/S架構(gòu),B/S架構(gòu)還是代表未來(lái)發(fā)展的SOA體系架構(gòu),都可以考慮應(yīng)用前置機(jī)來(lái)實(shí)現(xiàn)過(guò)負(fù)荷控制。
[1]劉德強(qiáng),王小波,李曉兵,林浩. 基于SOA的通信前置機(jī)系統(tǒng)的研究. 電力系統(tǒng)保護(hù)與控制, 2010,(4).
[2]王國(guó)強(qiáng),張貝克. 基于 Python的嵌入式腳本研究.計(jì)算機(jī)應(yīng)用與軟件, 2010,(3).
[3]周波,楊貫中,蔡宇輝. TCL/TK語(yǔ)言結(jié)構(gòu)分析及其在網(wǎng)絡(luò)教學(xué)中的應(yīng)用. 計(jì)算機(jī)工程, 2002, (4).
[4]何鐘林,張玉明,王擁軍,陳駿林. 電力通信網(wǎng)監(jiān)管中心前置機(jī)雙機(jī)系統(tǒng)方案設(shè)計(jì). 電力系統(tǒng)自動(dòng)化,1994, (9).