李冬琦 高 鍵
通過對(duì)各大型網(wǎng)站的架構(gòu)演變過程進(jìn)行分析,會(huì)發(fā)現(xiàn)他們具有一個(gè)顯著的共同點(diǎn)是在某個(gè)階段網(wǎng)站的架構(gòu)體系改造為服務(wù)化的體系,也就是常說的SOA(Service Oriented Architecture),中文譯為面向服務(wù)的體系結(jié)構(gòu)[1]。
在SOA系統(tǒng)中,資源被作為可通過標(biāo)準(zhǔn)方式訪問的獨(dú)立服務(wù)提供給網(wǎng)絡(luò)中的其他成員[2]。各個(gè)節(jié)點(diǎn)之間的通訊需遵守統(tǒng)一的交互標(biāo)準(zhǔn)。與傳統(tǒng)的系統(tǒng)結(jié)構(gòu)相比,SOA規(guī)定了資源間更為靈活的松散耦合關(guān)系[3]。基于服務(wù)化的主要目的是為了解決網(wǎng)站多元化,開發(fā)人員增加及訪問量增加帶來的水平伸縮問題[4]。
目前,SOA分布式系統(tǒng)實(shí)現(xiàn)方式主要有以下三種:基于socket API、基于消息中間件、基于網(wǎng)絡(luò)庫[5]。第一種方式很少使用,本文不做討論,著重研究后面兩種SOA系統(tǒng)。
隨著計(jì)算機(jī)的飛速發(fā)展,變化莫測的商業(yè)環(huán)境帶來了各種各樣、層出不窮的業(yè)務(wù)需求,原本單一的應(yīng)用架構(gòu)越來越難以滿足復(fù)雜的業(yè)務(wù)需求。因此,系統(tǒng)拆分已成為大勢所趨。由此演變?yōu)榇怪睉?yīng)用架構(gòu)體系[6]。
垂直應(yīng)用架構(gòu)緩解了單一應(yīng)用架構(gòu)所面對(duì)的動(dòng)態(tài)擴(kuò)展問題,系統(tǒng)面臨的總體壓力被均分到各個(gè)子系統(tǒng),且系統(tǒng)的總體規(guī)模可控,在一定程度上,降低了開發(fā)人員之間的協(xié)作的成本,提高了團(tuán)隊(duì)的整體開發(fā)效率[7]。
然而,當(dāng)垂直應(yīng)用程序的規(guī)模逐步增加,達(dá)到了一定數(shù)量時(shí),應(yīng)用之間的互相通信,互相調(diào)用便成為了亟待解決的問題[8]。否則,各個(gè)子系統(tǒng)的重疊業(yè)務(wù)需要重復(fù)實(shí)現(xiàn),也就是所謂的信息孤島[9]。此時(shí),核心業(yè)務(wù)被提取,作為一個(gè)單獨(dú)的子系統(tǒng)向外界提供服務(wù),實(shí)現(xiàn)業(yè)務(wù)之間的相互重用[10],系統(tǒng)已演變成分布式應(yīng)用程序架構(gòu),如圖1所示。
圖1 分布式架構(gòu)演變
分布式應(yīng)用程序架構(gòu)對(duì)業(yè)務(wù)邏輯重用的需求非常大,上層業(yè)務(wù)都想借用現(xiàn)有的底層服務(wù),快速的開發(fā)出功能復(fù)雜,內(nèi)容豐富的新應(yīng)用,減少人力和時(shí)間成本,迅速滿足不斷變化的市場需求[11]。公共的服務(wù)被分離出來,成為系統(tǒng)中的共享服務(wù),盡可能的復(fù)用已有的代碼和業(yè)務(wù)邏輯,避免重復(fù)工作,也就是前文中提到的SOA。
SOA體系結(jié)構(gòu)中,服務(wù)消費(fèi)者通過名稱,在服務(wù)路由中找到要調(diào)用服務(wù)的地址列表[12],服務(wù)路由如圖2所示。
圖2 服務(wù)路由示意圖
ZeroMQ(以下簡稱ZMQ)[13]是TCP/IP參考模型中新的一層,介于應(yīng)用層和傳輸層之間[14],如圖3所示。它和Socket的最大不同在于:普通的Socket是點(diǎn)對(duì)點(diǎn)的通訊,是1:1的關(guān)系。而ZMQ卻是節(jié)點(diǎn)與節(jié)點(diǎn)之間的通訊,是N:M的關(guān)系[15]。Socket套接字的使用者需要顯示的創(chuàng)建連接、銷毀連接、處理異常、選擇網(wǎng)絡(luò)協(xié)議。而ZMQ屏蔽了這些細(xì)節(jié),讓網(wǎng)絡(luò)編程變得更加簡單,高效[16]。
圖3 ZMQ所處層次
ZMQ提供了4種基礎(chǔ)消息通訊模式,分別是獨(dú)立對(duì)模式(Exclusive-Pair)、請(qǐng)求應(yīng)答模式(Request-Reply)、發(fā)布訂閱模式(Publish-Subscribe)和推拉模式(Push-Pull)。使用者可以根據(jù)具體應(yīng)用場景,組合其中的2種或更多的模式,構(gòu)建自己的通訊架構(gòu)解決方案。
3.2.1 獨(dú)立對(duì)模式
它是最簡單的一對(duì)一連接消息通訊模式,主要是為了兼容TCP原生Socket通訊模型。也常被用于進(jìn)程內(nèi)部的線程間通信。雖然數(shù)據(jù)可以雙向流動(dòng),但是一個(gè)服務(wù)端只能接受一個(gè)連接,這一點(diǎn)和后面的請(qǐng)求應(yīng)答模式有很大不同。
3.2.2 請(qǐng)求應(yīng)答模式
由客戶端(REQ模式)發(fā)起請(qǐng)求,然后等待服務(wù)端(REP模式)回復(fù)應(yīng)答。發(fā)出一個(gè)請(qǐng)求必須對(duì)應(yīng)收到一個(gè)應(yīng)答,站在客戶端的角度看,是發(fā)-收同步。站在服務(wù)端的角度看,是收-發(fā)同步。此模式與獨(dú)立對(duì)模式相比,最大的區(qū)別在于,一個(gè)服務(wù)端可以接受1至N個(gè)客戶端連接。該模式主要用于遠(yuǎn)程過程調(diào)用,既客戶端遠(yuǎn)程調(diào)用服務(wù)端的方法。典型的應(yīng)用場景就是Echo服務(wù)器,如圖4所示。
圖4 Echo服務(wù)器示意圖
3.2.3 發(fā)布訂閱模型
發(fā)布方(PUB模式)以單向方式分發(fā)數(shù)據(jù),并且不關(guān)心是否將所有信息發(fā)送到訂閱方(SUB模式),系統(tǒng)模型如圖5所示。如果發(fā)布方開始發(fā)布信息,而此時(shí)訂閱方尚未連接,則將直接丟棄該信息。訂閱方的信息丟失問題可以通過和請(qǐng)求應(yīng)答模式組合來彌補(bǔ)。訂閱方只負(fù)責(zé)接收,且不能應(yīng)答。該模式主要用于數(shù)據(jù)分發(fā)。天氣預(yù)報(bào),微博關(guān)注可以使用這種經(jīng)典模式。
圖5 發(fā)布訂閱模型
3.2.4 推拉模型
客戶端(PUSH模式)作為生產(chǎn)者和服務(wù)端(PULL模式)作為消費(fèi)者,系統(tǒng)模型如圖6所示??蛻舳嗽趦?nèi)部進(jìn)行負(fù)載均衡,使用平均分配算法,把所有消息均衡推送到服務(wù)端。與發(fā)布訂閱模式相比,消息在沒有被消費(fèi)情況下,不會(huì)被丟棄,而是堆積在客戶端。在消費(fèi)能力低于生產(chǎn)能力的情況下,可采用增加消費(fèi)者并行消費(fèi)的解決方案。該模式的主要應(yīng)用場景是多任務(wù)并行的負(fù)載均衡方案。
圖6 推拉模型
本文設(shè)計(jì)的SOA分布式系統(tǒng)框架如圖7所示,該系統(tǒng)由一個(gè)代理,多個(gè)客戶端和多個(gè)工人組成,屬于N:M的通訊。工人在代理中注冊(cè)自己的服務(wù)名和地址??蛻舳税l(fā)送請(qǐng)求給服務(wù)時(shí),先發(fā)送請(qǐng)求信息到代理,代理根據(jù)服務(wù)名把請(qǐng)求信息轉(zhuǎn)發(fā)給對(duì)應(yīng)的工人,工人完成請(qǐng)求之后,回復(fù)應(yīng)答信息到代理,再由代理轉(zhuǎn)發(fā)給對(duì)應(yīng)的客戶端。
圖7 總體架構(gòu)示意圖
SOA系統(tǒng)中的各個(gè)節(jié)點(diǎn)正常通訊的前提是節(jié)點(diǎn)之間的通信準(zhǔn)守統(tǒng)一的標(biāo)準(zhǔn)。為此,本文設(shè)計(jì)了一個(gè)簡單的通信協(xié)議Majordomo Protocol(以下簡稱MDP)。該協(xié)議定義了SOA系統(tǒng)中的成員組成、數(shù)據(jù)交換格式、心跳和請(qǐng)求/應(yīng)答處理過程。協(xié)議分為客戶端協(xié)議和工人協(xié)議兩部分,客戶端協(xié)議規(guī)定了代理和客戶端之間數(shù)據(jù)封裝格式;工人協(xié)議規(guī)定了代理和工人之間的數(shù)據(jù)封裝格式。
4.2.1 客戶端協(xié)議MDP/Client
請(qǐng)求/應(yīng)答:客戶端的請(qǐng)求/應(yīng)答數(shù)據(jù)包由4幀數(shù)據(jù)組成,數(shù)據(jù)封裝格式如下:
Frame 0:空(0個(gè)字節(jié))
Frame 1:“MDPC01”(MDP/Client v0.1)
Frame 2:Service name(服務(wù)節(jié)點(diǎn)注冊(cè)名)
Frame 3:Message body(消息體)
4.2.2 工人協(xié)議MDP/Worker
準(zhǔn)備命令:工人的準(zhǔn)備命令數(shù)據(jù)包由4幀數(shù)據(jù)組成,數(shù)據(jù)封裝格式如下:
Frame 0:Empty
Frame 1:“MDPW01”(MDP/Worker v0.1)Frame 2:0x01(代表準(zhǔn)備)
Frame 3:Service name(注冊(cè)的服務(wù)名)
請(qǐng)求應(yīng)答命令:工人的請(qǐng)求應(yīng)答命令是由6幀數(shù)據(jù)組成,數(shù)據(jù)封裝格式如下:
Frame 0:Empty
Frame 1:“MDPW01”(MDP/Worker v0.1)
Frame 2:0x02/0x03(0x02請(qǐng)求;0x03應(yīng)答)
Frame 3:Client address(客戶端身份)
Frame 4:Empty
Frame 5:Message body(消息體)
心跳命令:心跳命令是由3幀數(shù)據(jù)組成,數(shù)據(jù)封裝格式如下:
Frame 0:Empty
Frame 1:“MDPW01”(MDP/Worker v0.1)
Frame 2:0x04(代表心跳)
4.3.1 客戶端設(shè)計(jì)
客戶端在系統(tǒng)中扮演服務(wù)消費(fèi)者的角色,是命令的發(fā)起者,工作流程如圖8所示。
客戶端采用了同步的請(qǐng)求-應(yīng)答模式,使用REQ套接字,該套接字發(fā)送數(shù)據(jù)包時(shí),會(huì)在數(shù)據(jù)包的頭部自動(dòng)添加一幀空數(shù)據(jù)。在收到數(shù)據(jù)時(shí),自動(dòng)去掉第一幀空數(shù)據(jù)頭之后返回給應(yīng)用程序。REQ套接字必須發(fā)-收同步,否則會(huì)產(chǎn)生異常。
圖8 客戶端流程圖
客戶端應(yīng)該在沒有收到任何回復(fù)的情況下要做出合理的恢復(fù)策略。本文所采用的策略如下:
1)使用輪詢請(qǐng)求套接字的方式替換阻塞請(qǐng)求套接字。
2)如果在超時(shí)時(shí)間內(nèi)沒有收到應(yīng)答,關(guān)閉請(qǐng)求套接字重新建立一個(gè)新的請(qǐng)求套接字連接,再次發(fā)送請(qǐng)求。
3)如果在重試幾次之后依然沒有回復(fù),通知應(yīng)用進(jìn)程應(yīng)答接收超時(shí)??蛻舳酥饕涌诙x如下:
session=mdcli_new(“tcp://localhost:5555”);
void mdcli_destroy(&session);
zmsg_t*mdcli_send(self,service,request)
4.3.2 工人設(shè)計(jì)
工人在系統(tǒng)中扮演提供服務(wù)者的角色,是命令的接收者,工作流程如圖9所示。
圖9 工人流程圖
工人是一個(gè)同步和異步混合的套接字,所以使用DEALER(XREQ),工人在接收到客戶端請(qǐng)求的時(shí)候,使用同步方式,接收和發(fā)送心跳的時(shí)候使用異步方式。工人主要接口定義如下:
mdwrk_t*mdwrk_new(broker,service);
void mdwrk_destroy(&self_p);
zmsg_t*mdwrk_recv(self,reply)。
4.3.3 代理
代理是系統(tǒng)的服務(wù)總線,維護(hù)了服務(wù)名和工人地址之間的映射關(guān)系,代理的工作流程如圖10所示。
圖10 代理流程圖
代理使用ROUTER套接字,同時(shí)與客戶端和工人建立連接。代理首先把工人注冊(cè)的服務(wù)名和工人地址建立映射關(guān)系。為每一個(gè)服務(wù)維護(hù)一個(gè)共享隊(duì)列,隊(duì)列有多個(gè)寫入者(客戶端)和多個(gè)讀出者(工人)。客戶端發(fā)送的請(qǐng)求在代理中進(jìn)行公平排隊(duì)。然后轉(zhuǎn)發(fā)給提供對(duì)應(yīng)服務(wù)的工人。代理的主要接口定義如下:
broker_t*self=s_broker_new(verbose);
zmsg_t*msg=zmsg_recv(self->socket);
s_broker_client_msg(self,sender,msg);
s_broker_worker_msg(self,sender,msg)。
實(shí)驗(yàn)?zāi)康模簩?duì)比ZeroMQ實(shí)現(xiàn)的SOA通訊系統(tǒng)和MSMMQ、ActiveMQ、RabbitMQ的通信效率。
實(shí)驗(yàn)環(huán)境:三臺(tái)計(jì)算機(jī)組成局域網(wǎng),分別運(yùn)行客戶端、工人和代理。每臺(tái)計(jì)算機(jī)的性能參數(shù)如表1所示。
表1 計(jì)算機(jī)性能參數(shù)
實(shí)驗(yàn)方法:客戶端循環(huán)給工人發(fā)送10000個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包的大小是1KB??蛻舳擞涗洀拈_始發(fā)送到結(jié)束發(fā)送的時(shí)間。
實(shí)驗(yàn)結(jié)果:實(shí)驗(yàn)結(jié)果如表2所示。
結(jié)果分析:在被測試的四種消息中間件中,ZMQ的速度比其他三種消息中間件至少快4倍以上。但是和ZMQ官方數(shù)據(jù)相差甚遠(yuǎn),其主要原因在于,所有的通訊是在SOA通訊框架下進(jìn)行的,而官方的數(shù)據(jù)是在ZMQ的基本通訊模式中測試的。
表2 SOA系統(tǒng)性能測試結(jié)果
ZMQ的實(shí)質(zhì)是開源庫,可以被多種編譯器,多種編譯語言編譯。因此支持的系統(tǒng)較為廣泛,甚至支持一些嵌入式系統(tǒng)。
基于ZMQ構(gòu)建的SOA分布式系統(tǒng),比目前其他主流的消息中間件構(gòu)建的SOA通訊系統(tǒng)的速度有所提高,而且移植性能較好。但是ZMQ還不夠成熟,穩(wěn)定性不盡人意。
[1]程小雷,張丹峰.基于面向服務(wù)架構(gòu)的保險(xiǎn)代理信息管理系統(tǒng)的應(yīng)用[J].應(yīng)用力學(xué)與材料,2014,3009(519):1554-1557.
CHENGXiaolei,ZHANGDanfeng.Application of Information Management System for Insurance Agents Based on Service Oriented Architecture[J].Applied Mechanics and Materials,2014,3009(519):1554-1557.
[2]關(guān)寧,趙楊,王俊霖.基于 SOA的報(bào)表設(shè)計(jì)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2014,37(2):106-107.
GUAN Ning,ZHAO Yang,WANG Junlin.Report Design Based on SOA[J].Computer Systems&Applications,2014,37(2):106-107.
[3]曲婉嘉,劉穎,徐忠林.基于SOA的軍事目標(biāo)“選打一體化”信息系統(tǒng)研究[J].電子設(shè)計(jì)工程,2016,24(23):10-14.
QU Wanjia,LIU Ying,XU Zhonglin.Research on Information System of Military Project Based on SOA[J].International Electronic Elements,2016,24(23):10-14.
[4]潛昕,羅沙白,盧康權(quán).構(gòu)建基于分布式SOA架構(gòu)的統(tǒng)一身份認(rèn)證體系[J].軟件,2013,34(1):17-19.
QIAN Xin,LUO Shabai,LU Kangquan.Construct a Unified Identity Authentication System Based on Distributed SOA Architecture[J].Computer Engineering&Software,2013,34(1):17-19.
[5]李攀.基于SOA架構(gòu)和構(gòu)件技術(shù)的軟件開發(fā)[J].電子技術(shù)與軟件工程,2016(21):61.
LI Pan.Software Development Based on SOA Architecture and Component Technology[J].Electronic Technology&Software Engineering ,2016(21):61.
[6]蒲鳳平.基于中間件技術(shù)的分布式監(jiān)測系統(tǒng)研究[D].成都:西南交通大學(xué),2012:10-13.
PU Fengping.Research on Distributed Monitoring System Based on Middleware Technology[D].Chengdu:Southwest Jiaotong University,2012:10-13.
[7]陳康賢.大型分布式網(wǎng)站設(shè)計(jì)與實(shí)現(xiàn)[M].北京:電子工業(yè)出版社,2014:30-32.
CHENKangxian.Design and Implementation of Large Distributed Websites[M].Beijing:Electronic Industry Press,2014:30-32.
[8]葉崧,姚健東.基于ZeroMQ&JSON的分布式測控系統(tǒng)消息通信架構(gòu)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2014,37(2):106-107.
YE Song,YAO Jiandong.Design of Message Communication Architecture for Distributed Measurement and Control System Based on ZeroMQ&JSON[J].Modern Electronics Technique,2014,37(2):106-107.
[9]劉號(hào),張新晨,李中年.基于LCM與ZeroMQ的進(jìn)程間通信研究[J].電子科學(xué)技術(shù),2016,3(4):480-483.
LIU Hao,ZHANG Xinchen,LI Zhongnian.Research on Inter-process Communication Based on LCM and ZeroMQ[J].Electronic Science&Technology,2016,3(4):480-483.
[10]賈阿麗.基于分布式系統(tǒng)的PPP的設(shè)計(jì)與實(shí)現(xiàn)[D].重慶:重慶大學(xué),2014:25-27.
JIA Alin.Design and Implementation of PPP Based on Distributed System[D].Chongqing:Chongqing University,2014:25-27.
[11]湛文韜,解文濤,孫靖國,等.實(shí)時(shí)分布式系統(tǒng)性能測試技術(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014,24(7):226-229.
ZHAN Wentao,XIE Wentao,SUN Jingguo,et al.Research on Real-time Distributed System Performance Testing Technology[J].Computer Technology&Development,2014,24(7):226-229.
[12]田永紅,王艷芳,包力.基于SOA的Web服務(wù)組合建模研究[J].內(nèi)蒙古工業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版),2016,35(4):288-292.
TIAN Yonghong,WANG Yanfang,BAO Li.Research on Web Service Portfolio Modeling Based on SOA[J].Journal of Inner Mongolia University of Technology(Natural Science),2016,35(4):288-292.
[13]蒲鳳平,陳建政.基于ZeroMQ的分布式系統(tǒng)[J].電子測試,2012,31(7):24-29.
PU Fengping,CHEN Jianzheng.Distributed System Based on ZeroMQ[J].Electronic Test,2012,31(7):24-29.
[14]張蓓蓓,張松,李京.基于ZeroMQ的電子偵察系統(tǒng)數(shù)據(jù)通信平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2016,37(3):521-525.
ZHANG Beibei,ZHANG Song,LI Jing.Design and Implementation of Data Communication Platform for Electronic Reconnaissance System Based on ZeroMQ[J].Journal of Chinese Mini-Micro Computer Systems,2016,37(3):521-525.
[15]皮特亨特金斯.ZeroMQ消息機(jī)制的應(yīng)用[M].美國:奧萊利媒體,2013:49-52.Pieter Hintjens.ZeroMQ-Messaging for Many Applications[M].United States of America:O'Reilly Media,2013:49-52.
[16]薛鵬飛,胡榮貴,胡勁松.基于ZeroMQ的分布式系統(tǒng)通信方法[J].計(jì)算機(jī)應(yīng)用,2015,35(S2):34-37.
XUE Pengfeng,HU Ronggui,HU Jinsong.Distributed System Communication Method Based on ZeroMQ[J].Journal of Computer Applications,2015,35(S2):34-37.