劉海燕,程郁文,楊健康
(裝甲兵工程學(xué)院信息工程系,北京100072)
目前,大型的信息系統(tǒng)正逐步向構(gòu)件化、服務(wù)化的體系結(jié)構(gòu)方向發(fā)展,這種體系便于軟件的開發(fā)、部署和擴展,可以為應(yīng)用程序提供即插即用的功能。構(gòu)件化、服務(wù)化的軟件迫切需要研究分布式環(huán)境下的數(shù)據(jù)分發(fā)技術(shù)。所謂數(shù)據(jù)分發(fā),是指數(shù)據(jù)的生產(chǎn)者通過各種方式將數(shù)據(jù)傳送到用戶的過程。由于網(wǎng)絡(luò)技術(shù)的普及,建立基于網(wǎng)絡(luò)的數(shù)據(jù)分發(fā)服務(wù)成為數(shù)據(jù)分發(fā)的發(fā)展趨勢。軍隊指揮信息系統(tǒng)是基于軍事通信網(wǎng)的大型分布式信息系統(tǒng),數(shù)據(jù)傳輸是戰(zhàn)場偵察情報、指揮控制、維修保障業(yè)務(wù)軟件運行的基礎(chǔ),因此目前基于分發(fā)服務(wù)的軟件體系結(jié)構(gòu)得到廣泛應(yīng)用,而信息分發(fā)服務(wù)也成為軍事信息系統(tǒng)體系中平臺性、支撐性軟件構(gòu)件。
對象管理組織(Object Management Group,OMG)為分布式實時系統(tǒng)制訂了一個數(shù)據(jù)分發(fā)服務(wù)規(guī)范(Data Distribution Service,DDS)[1]。DDS 描述了2個層次的接口:低層的以數(shù)據(jù)為中心的發(fā)布訂購層(Data Centric Publish Subscribe,DCPS),用于將數(shù)據(jù)發(fā)布者發(fā)布的信息高效準(zhǔn)確地傳送給數(shù)據(jù)訂購者,是DDS規(guī)范的核心;高層的數(shù)據(jù)本地重構(gòu)層(Data Local Reconstruction Layer,DLRL)允許將服務(wù)簡單地集成到應(yīng)用層,該層是可選的。DDS還定義了一套服務(wù)質(zhì)量(Quality of Service,QoS)策略,能基于QoS進行數(shù)據(jù)的訂購和分發(fā)。OpenDDS軟件是OMG對DDS的DCPS層的一個開源實現(xiàn)。我國也制定了相關(guān)的數(shù)據(jù)共享標(biāo)準(zhǔn)——數(shù)據(jù)分發(fā)服務(wù)指南與規(guī)范[2],該標(biāo)準(zhǔn)對基于因特網(wǎng)的數(shù)據(jù)分發(fā)體系進行了描述,對相關(guān)的環(huán)節(jié)和內(nèi)容提出了要求。在我國,近些年一些科研機構(gòu)致力于數(shù)據(jù)分發(fā)服務(wù)的體系結(jié)構(gòu)、實現(xiàn)技術(shù)的研究[3-4],取得了一定的成果。在實際應(yīng)用中,有越來越多的大型軟件系統(tǒng)開始采用基于數(shù)據(jù)分發(fā)服務(wù)中間件的軟件體系結(jié)構(gòu)[5-6]。
盡管目前既有開源的分發(fā)系統(tǒng),如OpenDDS,又有商用的分發(fā)中間件,但可能由于分發(fā)系統(tǒng)太復(fù)雜,或具體應(yīng)用有具體的傳輸環(huán)境和傳輸需求,因此許多系統(tǒng)都開發(fā)自己的分發(fā)中間件,在滿足自定義的信息格式、傳輸質(zhì)量需求的基礎(chǔ)上,提供一定范圍的通用性。為滿足局域網(wǎng)中的分布式系統(tǒng)各進程間消息交流的需求,筆者參考DDS中DCPS規(guī)范的內(nèi)容,根據(jù)應(yīng)用系統(tǒng)的環(huán)境和對數(shù)據(jù)傳輸質(zhì)量的要求,設(shè)計實現(xiàn)了一個基于消息的分發(fā)服務(wù)中間件。該中間件能提供進程間并發(fā)、異步、可靠、按序的消息傳輸功能,使上層的進程能專注于各自業(yè)務(wù)流程的實現(xiàn)。
數(shù)據(jù)分發(fā)服務(wù)實現(xiàn)信息的訂購、發(fā)布機制,提供用戶按需訂購信息、消息按需推送的機制。按消息的分發(fā)機制劃分,數(shù)據(jù)分發(fā)服務(wù)中間件可以分為2大類:集中式分發(fā)系統(tǒng)和分布式分發(fā)系統(tǒng)。
在數(shù)據(jù)分發(fā)系統(tǒng)中存在一個分發(fā)服務(wù)器,這個服務(wù)器保存了各個節(jié)點間通信所必須的信息,如客戶端標(biāo)志、訂購信息等??蛻舳藨?yīng)用程序通過客戶端分發(fā)中間件接入分發(fā)系統(tǒng),實現(xiàn)客戶的注冊、信息的訂購和發(fā)布。信息實際傳輸可以使用點到點方式直接送達,也可以通過服務(wù)器節(jié)點轉(zhuǎn)發(fā)。集中式數(shù)據(jù)分發(fā)系統(tǒng)的結(jié)構(gòu)如圖1所示。
圖1 集中式數(shù)據(jù)分發(fā)系統(tǒng)的結(jié)構(gòu)
集中式結(jié)構(gòu)的優(yōu)點是便于系統(tǒng)內(nèi)各應(yīng)用程序間的協(xié)調(diào)控制;缺點是存在單一故障點,一旦分發(fā)服務(wù)器癱瘓,則整個分發(fā)系統(tǒng)也隨之癱瘓。
在數(shù)據(jù)分發(fā)系統(tǒng)中所有節(jié)點都是對等的,每個節(jié)點都有一個發(fā)布/訂購信息的拷貝,節(jié)點的注冊和信息的訂購都在本地完成,由分發(fā)中間件完成信息的組播分發(fā),以保證所有節(jié)點信息的一致性和完整性。在進行信息發(fā)布時,應(yīng)用程序首先寫到本地,再由分發(fā)服務(wù)中間件根據(jù)訂購信息將數(shù)據(jù)分發(fā)給訂購者。分布式分發(fā)系統(tǒng)的結(jié)構(gòu)如圖2所示。
圖2 分布式數(shù)據(jù)分發(fā)系統(tǒng)的結(jié)構(gòu)
本分發(fā)系統(tǒng)的目的是為一類運行在局域網(wǎng)中的分布式協(xié)同系統(tǒng)提供進程間的消息分發(fā)中間件,在方便進程間協(xié)同的基礎(chǔ)上,使上層程序更專注于業(yè)務(wù)流程的設(shè)計。這類系統(tǒng)運行在局域網(wǎng)中,需要交流數(shù)據(jù)的進程數(shù)有數(shù)十個;進程間交流的多為一些協(xié)同和狀態(tài)消息,消息長度一般為幾十到幾百字節(jié);消息的傳輸需要有一定的可靠性和時序性;此外,各進程需要有并發(fā)和異步通信能力。為滿足上述需求,筆者設(shè)計了數(shù)據(jù)分發(fā)軟件InfoSubDstrSys。該分發(fā)系統(tǒng)采用集中式的結(jié)構(gòu),一個分發(fā)服務(wù)器獨立運行,分發(fā)客戶端以動態(tài)鏈接庫的形式由上層應(yīng)用程序調(diào)用;客戶端與服務(wù)器間采用TCP傳輸協(xié)議,以消息號定義消息的類別,傳輸信息的格式為消息號、消息長度、消息體;采用IO端口映射技術(shù)支持多進程的并發(fā)通信;通過事件機制和回調(diào)函數(shù)技術(shù)為進程提供異步通信功能。
數(shù)據(jù)分發(fā)系統(tǒng)InfoSubDstrSys由2部分組成:分發(fā)服務(wù)器InfoSubDstrSrv和客戶端分發(fā)中間件InfoS-ubDstrCli。二者底層通過TCP協(xié)議實現(xiàn)信息的傳輸。
分發(fā)服務(wù)器InfoSubDstrSrv采用IO端口映射套接字技術(shù)實現(xiàn)多套接字的并發(fā)通信。服務(wù)器主要由3個模塊組成:主控模塊、連接管理模塊和消息分發(fā)模塊。
1)主控模塊負(fù)責(zé)初始化套接字環(huán)境、線程池管理、服務(wù)器控制命令處理等任務(wù)。
2)連接管理模塊負(fù)責(zé)接收客戶端分發(fā)中間件的連接請求,建立并維護客戶連接套接字表以及套接字相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
3)消息分發(fā)模塊是分發(fā)服務(wù)器的核心部分,由IO端口關(guān)聯(lián)的線程池中的線程執(zhí)行。它監(jiān)聽所有通信事件,接收客戶端發(fā)來的消息,對接收到的客戶端消息進行解析,根據(jù)消息類型進行相應(yīng)的處理。建立并維護客戶的訂購信息庫,完成消息的訂購、訂購的取消,根據(jù)訂購信息進行消息轉(zhuǎn)發(fā)等功能。
客戶端分發(fā)中間件InfoSubDstrCli主要由2部分組成:消息分發(fā)模塊和應(yīng)用程序接口模塊。其中:消息分發(fā)模塊負(fù)責(zé)監(jiān)聽并接收分發(fā)服務(wù)器發(fā)來的消息;應(yīng)用程序接口模塊則提供用戶應(yīng)用程序使用分發(fā)系統(tǒng)的API函數(shù)。
客戶端分發(fā)中間件的主體是導(dǎo)出類CInfoSub-DistrbCli和回調(diào)函數(shù)_CallBackFun的定義?;卣{(diào)函數(shù)用于實現(xiàn)對接收消息的解析和處理,是一個全局函數(shù),函數(shù)定義如下:
Typedef int_stdcall_CallBackFun(char*recvBuf,unsigned short recvLen)。
每個應(yīng)用都要根據(jù)自己的特定需求定義自己的回調(diào)函數(shù)。
導(dǎo)出類CInfoSubDistrbCli的定義如下。
友元函數(shù)msgHandler負(fù)責(zé)異步接收消息和回調(diào)函數(shù)的調(diào)度,從而實現(xiàn)消息的推送功能。
分發(fā)服務(wù)器InfoSubDstrSys作為一個獨立的進程運行在一臺主機上,處理多個不同的客戶的注冊、消息訂購和信息的分發(fā)。
客戶端分發(fā)中間件以動態(tài)鏈接庫的形式存在,應(yīng)用程序通過動態(tài)鏈接庫提供的API接口接入分發(fā)系統(tǒng)。應(yīng)用程序使用分發(fā)系統(tǒng)的一般流程如下。
1)定義回調(diào)函數(shù),可以對不同的消息定義不同的回調(diào)函數(shù)。
2)聲明客戶端對象。
CInfoSubDistrbCli client;
3)注冊客戶端。
client.registerCLi(SrvIP,SrvPort);∥參數(shù)為分發(fā)
服務(wù)器的IP地址和端口號
4)訂購消息或取消消息訂購。
client.MsgSubscribe(msgno,myCallBackFun);∥訂購消息,參數(shù)為消息號和回調(diào)函數(shù)
client.MsgSubscribeCancel(msgno);∥取消訂購,參數(shù)為消息號
5)發(fā)布消息。
client.sendMsg(msgno,m_sendBuf,m_sendLen);∥參數(shù)為消息號、消息緩沖區(qū)和消息長度
6)客戶端取消注冊。
client.unRegisterCli();
其中,消息以消息號來區(qū)分,消息號是一個整數(shù),每個消息號對應(yīng)一種消息。每個客戶可以訂購0個或者多個消息。在訂購一個消息時,需指定接收該類消息時的回調(diào)函數(shù)。不同消息的回調(diào)函數(shù)可以相同也可以不同??蛻舳顺绦蛟谧猿晒χ?,可以隨時訂購或取消訂購某種消息。
圖3是一個基于InfoSubDstrSys實現(xiàn)的應(yīng)用程序示例。界面上分別顯示了分發(fā)系統(tǒng)的基本功能。注冊按鈕對應(yīng)客戶端的注冊,訂購、取消訂購按鈕分別對應(yīng)消息的訂購和取消,發(fā)送消息按鈕將消息發(fā)送到分發(fā)服務(wù)器。每個客戶端將收到的消息實時顯示在界面上。
圖3 基于分發(fā)系統(tǒng)的應(yīng)用示例
同時運行該程序的2個實例,如圖4、5所示。在圖4、5中,左端的應(yīng)用訂購了1號消息,右端應(yīng)用訂購了1號和2號消息。在圖4中,當(dāng)右端應(yīng)用發(fā)送2號消息“222”時,只有訂購了2號消息的應(yīng)用收到了該消息;在圖5中,右端應(yīng)用發(fā)送了1號消息“111”,可以看出2個應(yīng)用都收到了該消息。
本示例僅演示了字符消息根據(jù)訂購需求進行的并發(fā)、異步、按序的分發(fā)過程。實際上,由于TCP傳輸協(xié)議對消息的類型和長度并不限制,因此該分發(fā)平臺可以用于任何類型、任何長度數(shù)據(jù)的分發(fā)。
圖4 只有右端應(yīng)用收到2號消息
圖5 2個應(yīng)用都收到1號消息
該數(shù)據(jù)分發(fā)中間件已經(jīng)用于某仿真系統(tǒng)中,為系統(tǒng)的多個進程提供數(shù)據(jù)交換和共享服務(wù)。由于開發(fā)者不必關(guān)心信息交換的實現(xiàn)細(xì)節(jié),可以更專注于業(yè)務(wù)邏輯的開發(fā),因而提高了開發(fā)效率。該系統(tǒng)的不足是應(yīng)用規(guī)模受限。因為該分發(fā)系統(tǒng)使用了集中式結(jié)構(gòu),僅有一個服務(wù)器,所以一般只用于局域網(wǎng)內(nèi)的應(yīng)用系統(tǒng)中。進一步的研究應(yīng)該關(guān)注如何設(shè)計多個協(xié)作的服務(wù)器,實現(xiàn)分布式結(jié)構(gòu)的分發(fā)系統(tǒng),為大規(guī)模分布式系統(tǒng)提供信息分發(fā)服務(wù)。
[1]OMG.Data Distribution Service for Real-time Systems Version 1.2[EB/OL].(2007-01-01)[2011-10-25].http:∥www.omg.org
[2]SDS/T 2241_2004科學(xué)數(shù)據(jù)共享工程技術(shù)標(biāo)準(zhǔn):數(shù)據(jù)分發(fā)服務(wù)指南與規(guī)范[S].
[3]盧傳富,蔡志明,夏學(xué)知.數(shù)據(jù)分發(fā)服務(wù)體系結(jié)構(gòu)的研究[J].計算機與數(shù)字工程,2008,36(5):67-69.
[4]裘楷,沈棟,李娜,等.基于DCPS模型的數(shù)據(jù)分發(fā)服務(wù)DDS的研究[J].電子科技,2006(11):68-72.
[5]姚兵,蔡婷,李峻林,等.基于DDS模型的數(shù)據(jù)分發(fā)中間件的設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2009,30(3):619-623.
[6]曹萬華,謝蓓,吳海昕,等.基于 DDS的發(fā)布/訂購中間件設(shè)計[J].計算機工程,2007,33(18):78-80.