專利名稱:一種基于消息的分布式系統(tǒng)以及在其中通信的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)通信領(lǐng)域,尤其涉及一種基于消息的分布式系統(tǒng),以及在所述系統(tǒng)中利用消息通信的方法。
背景技術(shù):
隨著IP(Internet Protocol,網(wǎng)際協(xié)議)網(wǎng)絡(luò)的廣泛延伸和帶寬不斷增長,網(wǎng)絡(luò)提供了更大的能力,通過網(wǎng)絡(luò)對系統(tǒng)進行分布部署,大大提高了系統(tǒng)的性能和靈活性,分布式軟件系統(tǒng)架構(gòu)是當今很多系統(tǒng)的基本特征。分布式作為一個系統(tǒng)級的架構(gòu),雖然對于不同的系統(tǒng)具有不同的考慮,但都有一個最基本需求,即分布式調(diào)用,具體地說,客戶端和服務(wù)端可以分布在IP網(wǎng)絡(luò)中,并且客戶端和服務(wù)端的程序不必使用相同的編譯環(huán)境和運行環(huán)境,如客戶端可以使用java(一種計算機語言)編寫,服務(wù)端使用C++(一種計算機語言)語言編寫,客戶端可以運行在基于Intel(美國英特爾公司)的CPU(中央處理器)的Windows(美國微軟公司生產(chǎn)的“視窗”操作系統(tǒng))環(huán)境,服務(wù)端運行在SUN Solaris(美國太陽公司生產(chǎn)的操作系統(tǒng))上。
實現(xiàn)分布式調(diào)用需要考慮的幾個關(guān)鍵的因素包括通信模式、對象解析、編碼方式等。
通信模式對于比較復(fù)雜的系統(tǒng)各模塊既是服務(wù)端提供服務(wù),同時也是客戶端使用其他模塊的服務(wù),通信模式是針對一個具體的場景,有如下模式遠程過程調(diào)用—客戶端發(fā)送請求給服務(wù)端,然后等待響應(yīng),即同步通信。
消息傳遞—客戶機發(fā)送一個請求,并不期待一個響應(yīng)。
異步回調(diào)—客戶機以上述兩種方式之一調(diào)用服務(wù),雙方交換角色,進行回調(diào),這種模式可以以前述兩種方式中的任一種構(gòu)建。
對象解析由于系統(tǒng)模塊的分布式部署,不再在一個進程甚至一個機器上,調(diào)用前必須有通信對象的名稱,這個名稱應(yīng)該是邏輯上比較獨立的,系統(tǒng)中保持唯一,不與物理資源綁定,避免在部署發(fā)生變化后需要修改程序,因此一般需要一個命名服務(wù)提供名字解析服務(wù)。如CORBA(Common Object RequestBroker Architecture,公共對象請求代理體系結(jié)構(gòu))使用名字(通過命名服務(wù)器)提供對象定位,DCOM(Distributed Component Object Model,分布式組件對象模型)使用系統(tǒng)注冊提供名稱服務(wù),J2EE(J2EE是一個開放的、基于標準的開發(fā)和部署的平臺)使用JNDI(JNDI,Java Naming and DirectoryInterface,Java命名和目錄接口)提供名字服務(wù)。
編碼方式通信雙方由于不一定是使用相同的編程語言和具有相同的CPU,所以對字節(jié)序的理解不一樣,如Java都是BigEndian(大端模式、高位優(yōu)先、正向字序、網(wǎng)絡(luò)字序、UNIX字序),C++語言在Intel上是LittleEndian(小端模式、低位優(yōu)先、逆向字序、INTEL字序、NT字序),在PowerPC(一種個人臺式計算機)上是BigEndian;除了字節(jié)序外,結(jié)構(gòu)對象的內(nèi)存排列(Layout)也不一致。分布式調(diào)用雙方需要有一種一致的編碼方式,常用的編碼方式如AS N.1(Abstract Syntax Normal dot 1,一種使用比較廣泛的數(shù)據(jù)編碼規(guī)范)和CDR(Common Data Representation,公共數(shù)據(jù)表示,CORBA中使用的數(shù)據(jù)編碼方式)。
在現(xiàn)有技術(shù)中,CORBA是很成熟的一種分布式開發(fā)技術(shù)。如圖1所示,基于CORBA開發(fā)步驟通??筛爬?.用IDL(Interface Difinition Language,CORBA中用于描述接口的語言)文件定義客戶端(Client)和服務(wù)端(Server)的應(yīng)用編程接口(API);2.編譯IDL文件,生成客戶端代理(stub)代碼、服務(wù)端骨架(skeleton)代碼;3.在代理和骨架的基礎(chǔ)上分別實現(xiàn)服務(wù)端和客戶端。
其中,圖中ORB(Object Remote Broker)Core是CORBA里面的對象遠程代理核心。
然而,在上述現(xiàn)有的以CORBA作為分布式開發(fā)的技術(shù)中存在如下的缺點1.使用復(fù)雜,學習成本高。直接使用CORBA開發(fā),需要學習的知識很多,對大多數(shù)的C++程序員來說,比較困難。
2.CORBA支持類似C++的調(diào)用方式,實現(xiàn)一般OO(Object Oriented,面向?qū)ο蟮?系統(tǒng)比較方便,但對于一些領(lǐng)域,需要并發(fā)處理大量消息,因此,通常不需要復(fù)雜的OO建模,而是需要異步傳遞消息和通知。
3.只支持單一的編碼方式。使用CORBA技術(shù)時,在用戶定義了IDL結(jié)構(gòu)后,自動使用CDR編碼,而對于一些移植系統(tǒng),可能有其他的編碼方式,如ASN.1,這時需要在IDL和其他編碼方式之間作轉(zhuǎn)換。
4.生成的代碼量大,占用的內(nèi)存和硬盤空間大。對于一些非服務(wù)器上的應(yīng)用,如嵌入式單板,存儲器容量有限,使用IDL定義接口導(dǎo)致大量的代碼,這些代碼要編譯到系統(tǒng)中,造成目標文件很大。
5.無法在支持HA(高可用性)和LB(負載平衡)等電信要求。使用CORBA技術(shù)時,直接使用IDL定義接口,由于每個IDL直接編譯成代碼(包括編解碼/通信處理),這些代碼散布在系統(tǒng)各處,而且這些代碼也是用戶不能修改的,用戶無法在一個地方進行統(tǒng)一處理,而HA、LB等高可用性要求系統(tǒng)能在一些點進行處理,如入口或出口。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種基于消息的分布式系統(tǒng),該系統(tǒng)可以降低分布式開發(fā)的難度。本發(fā)明還提出了一種在所述系統(tǒng)中利用消息進行通信的方法。
為此,本發(fā)明提供以下技術(shù)方案一種基于消息的分布式系統(tǒng),所述系統(tǒng)包括至少一個節(jié)點,所述節(jié)點包括至少一個完成特定功能的模塊,所述模塊包括至少一個服務(wù)接入點,用于接收服務(wù)請求消息,并根據(jù)所述服務(wù)請求消息完成所需服務(wù);消息發(fā)送器,用于將服務(wù)請求消息發(fā)送至目的服務(wù)接入點,請求所需服務(wù)。
所述服務(wù)接入點具有在所述系統(tǒng)內(nèi)唯一的服務(wù)接入點標識;所述消息中包含目的服務(wù)接入點的標識。
所述消息發(fā)送器包括同步消息發(fā)送器,用于將同步消息發(fā)送至目的服務(wù)接入點,請求所需服務(wù),并將服務(wù)結(jié)果返回給發(fā)送者;異步消息發(fā)送器,用于將異步消息發(fā)送至目的服務(wù)接入點,請求所需服務(wù),但不負責將服務(wù)結(jié)果返回給發(fā)送者。
所述服務(wù)接入點包括至少一個服務(wù)執(zhí)行單元,根據(jù)服務(wù)請求消息完成所需服務(wù);消息接收和調(diào)度單元,接收服務(wù)請求消息,并分發(fā)給相應(yīng)的服務(wù)執(zhí)行單元,將服務(wù)結(jié)果返回給服務(wù)請求方。
所述消息接收和調(diào)度單元具體包括同步消息接收和調(diào)度單元,接收服務(wù)請求方的同步消息,調(diào)用相應(yīng)的服務(wù)執(zhí)行單元完成所需服務(wù),將服務(wù)結(jié)果返回給服務(wù)請求方。
異步消息接收和調(diào)度單元,接收服務(wù)請求方的同步消息,并分發(fā)給相應(yīng)的服務(wù)執(zhí)行單元,待所述服務(wù)執(zhí)行單元完成服務(wù)后,創(chuàng)建新消息,將服務(wù)結(jié)果放在所述新消息中通過消息發(fā)送器發(fā)送給服務(wù)請求方。
所述節(jié)點還包括名字服務(wù)器,用于提供名字服務(wù);所述服務(wù)接入點將該服務(wù)接入點的標識及訪問地址注冊到所述名字服務(wù)器;所述消息發(fā)送器根據(jù)消息中的目的服務(wù)接入點標識從名字服務(wù)器得到目的服務(wù)接入點的訪問地址,將消息發(fā)送至目的服務(wù)接入點。
所述消息包括消息頭和消息體,所述消息頭中至少包含發(fā)送所述消息的服務(wù)接入點標識,以及接收所述消息的服務(wù)接入點標識,所述消息體包含有服務(wù)需要的數(shù)據(jù)。
所述服務(wù)接入點標識由節(jié)點號、模塊號和服務(wù)接入點號組成。
所述模塊還設(shè)有一個備份模塊。
所述模塊還包括服務(wù)接入點列表存儲器,用于存儲所述模塊中的所有服務(wù)接入點。
所述模塊還包括一個服務(wù)接入點管理單元,用來管理所述模塊中的所有服務(wù)接入點。
本發(fā)明還提供一種在分布式系統(tǒng)中利用消息進行通信的方法,用于第一服務(wù)接入點向第二服務(wù)接入點請求服務(wù),所述方法包括以下步驟1)所述第一服務(wù)接入點通過消息發(fā)送器向所述第二服務(wù)接入點發(fā)送消息;
2)所述第二服務(wù)接入點接收消息,執(zhí)行所需服務(wù);3)所述第二服務(wù)接入點返回服務(wù)結(jié)果。
所述消息為同步消息,所述步驟2)具體為所述第二服務(wù)接入點接收消息,調(diào)用相應(yīng)服務(wù)執(zhí)行單元,完成所需服務(wù)。
所述消息為異步消息,所述步驟2)具體為所述第二服務(wù)接入點將所述消息發(fā)送給相應(yīng)的服務(wù)執(zhí)行單元,所述服務(wù)執(zhí)行單元完成所需服務(wù)。
所述步驟3)具體為所述第二服務(wù)接入點創(chuàng)建新的消息,將服務(wù)結(jié)果放入所述新消息中,通過消息發(fā)送器發(fā)送給所述第一服務(wù)接入點。
所述消息包括消息頭和消息體,所述消息頭中至少包含發(fā)送所述消息的服務(wù)接入點標識,以及接收所述消息的服務(wù)接入點標識,所述消息體包含有服務(wù)需要的數(shù)據(jù)。
所述服務(wù)接入點標識由節(jié)點號、模塊號和服務(wù)接入點號組成。
所述模塊還設(shè)有一個備份模塊,所述步驟1)具體為所述第一服務(wù)接入點通過消息發(fā)送器向第二服務(wù)接入點請求服務(wù),所述消息發(fā)送器向位于所有模塊的所述第二服務(wù)接入點分別發(fā)送請求所述服務(wù)的消息。
所述步驟3)具體為位于非備份模塊的所述第二服務(wù)接入點返回服務(wù)結(jié)果。
由于本發(fā)明的系統(tǒng)采用了節(jié)點-模塊-服務(wù)接入點的分層結(jié)構(gòu),發(fā)送消息統(tǒng)一使用消息發(fā)送器,接收消息統(tǒng)一使用服務(wù)點接入單元,用戶不用關(guān)心系統(tǒng)的具體信息,只需要知道對端的接入服務(wù)點標識就能夠完成在分布式環(huán)境下的通信,簡化了分布式開發(fā)的步驟,降低了分布式開發(fā)的難度,提高了系統(tǒng)的可靠性,提高了系統(tǒng)的可擴充性,例如可以通過統(tǒng)一的消息處理支持統(tǒng)一的消息日志,實現(xiàn)HA方案。
圖1是基于CORBA的通常開發(fā)步驟示意圖;圖2是本發(fā)明中所述系統(tǒng)的結(jié)構(gòu)示意圖;
圖3是節(jié)點級聯(lián)過程的流程圖;圖4是主節(jié)點與一個從節(jié)點級聯(lián)時的名字服務(wù)結(jié)構(gòu)示意圖;圖5是級聯(lián)后主節(jié)點上看到的名字服務(wù)的目錄樹示意圖;圖6是級聯(lián)后從節(jié)點上看到名字服務(wù)的目錄樹示意圖;圖7是根據(jù)本發(fā)明優(yōu)選實施方案中節(jié)點的結(jié)構(gòu)示意圖;圖8是用C++語言實現(xiàn)一個模塊實例的結(jié)構(gòu)示意圖;圖9是同步調(diào)用流程示意圖;圖10是異步調(diào)用流程示意圖;圖11是本系統(tǒng)在HA方案中應(yīng)用的示意圖。
具體實施例方式
下面結(jié)合附圖和具體實施例對本發(fā)明作進一步說明,但不作為對本發(fā)明的限定。
圖2是根據(jù)本發(fā)明優(yōu)選實施方案的分布式系統(tǒng)的結(jié)構(gòu)示意圖。如圖2所示,在系統(tǒng)內(nèi)分布有多個節(jié)點,在節(jié)點中包括多個完成特定功能的模塊。
本發(fā)明所述的節(jié)點分布在廣域網(wǎng)內(nèi)或局域網(wǎng)內(nèi)。在圖2中,節(jié)點1為主節(jié)點,其他節(jié)點是從節(jié)點,主節(jié)點是在邏輯上定義的,例如可以根據(jù)實際需要把其中一個獨立的節(jié)點設(shè)置成主節(jié)點,其余節(jié)點設(shè)置成從節(jié)點。從節(jié)點和主節(jié)點通過級聯(lián)的方式聯(lián)合,這將在本文的下面進行詳細描述。每個節(jié)點都有一個唯一的“節(jié)點號”,以和其他節(jié)點相區(qū)別。每個節(jié)點都包括一個名字服務(wù)器模塊,所有從節(jié)點都注冊到主節(jié)點的名字服務(wù)器模塊上,節(jié)點間通過名字服務(wù)器模塊級聯(lián)訪問。這將在下面進行詳細描述。
圖3描述了從節(jié)點的名字服務(wù)級聯(lián)到主節(jié)點名字服務(wù)的過程。
如圖3所示,在級聯(lián)前,所有節(jié)點的名字服務(wù)器下都只有一個根目錄節(jié)點Node0(節(jié)點0),級聯(lián)過程可概括為步驟101在主節(jié)點名字服務(wù)的根下面創(chuàng)建一個目錄節(jié)點Node1(節(jié)點1),并連接到自己的Node0;步驟102在主節(jié)點名字服務(wù)的根下面創(chuàng)建一個目錄節(jié)點Node2(節(jié)點2),并連接到第一個從節(jié)點的Node0;步驟103在從節(jié)點名字服務(wù)的根下創(chuàng)建一個目錄節(jié)點Primary(主目錄節(jié)點),連接到主節(jié)點的根上;重復(fù)步驟102、103兩步增加新的從節(jié)點,從節(jié)點號依次增加,如Node3、Node4、Node5......。
圖4是主節(jié)點與一個從節(jié)點級聯(lián)時的名字服務(wù)的結(jié)構(gòu)示意圖。
本領(lǐng)域的技術(shù)人員通過上面的描述和公知的常識,應(yīng)該理解創(chuàng)建節(jié)點、目錄節(jié)點以及這些節(jié)點如何通過名字服務(wù)器模塊聯(lián)合在一起的具體實現(xiàn)過程,因此,在這里不再贅述。
圖5是級聯(lián)后,從主節(jié)點的名字服務(wù)看到的名字服務(wù)目錄樹的示意圖。在圖6中,主節(jié)點名字服務(wù)目錄樹的根(Root)下有內(nèi)容相同的Node0和Node1,Node1下是主節(jié)點的所有模塊名目錄,模塊名目錄下面是該模塊所有服務(wù)接入點(SAP)的目錄(在下文中將對SAP詳細描述)。其他節(jié)點的目錄連接在主節(jié)點名字服務(wù)目錄樹的根下,其結(jié)構(gòu)與Node1相同,如圖中的Node2、Node3。
圖6是級聯(lián)后,在從節(jié)點上的名字服務(wù)看到的名字服務(wù)目錄樹的示意圖。該從節(jié)點的Root目錄下有一個Node0,Node0下是該從節(jié)點的所有模塊名目錄,模塊名目錄下面是該模塊所有SAP的目錄。該從節(jié)點的根目錄下還有一個Primary節(jié)點,在Primary節(jié)點下面連接著主節(jié)點和其他從節(jié)點的根目錄。
圖7是根據(jù)本發(fā)明優(yōu)選實施方式的節(jié)點的結(jié)構(gòu)示意圖。圖中,1、服務(wù)接入點,2消息發(fā)送器。如圖7和圖2所示,在該優(yōu)選的實施方式中,各個節(jié)點中包括一個名字服務(wù)器以及多個完成特定功能的模塊。每個模塊都包括一個消息發(fā)送器2和至少一個服務(wù)接入點1。
在該實施方式中,消息發(fā)送器包括同步消息發(fā)送器和異步消息發(fā)送器。SAP則包括至少一個服務(wù)執(zhí)行單元和消息接收和調(diào)度單元。消息接收和調(diào)度單元包括同步消息接收和調(diào)度單元。
SAP是模塊對外的接口,都有一個在系統(tǒng)內(nèi)唯一的SAP標識。SAP標識是對其進行訪問的外部標識。SAP標識可以是系統(tǒng)內(nèi)唯一的全局分層地址,具體地說,分層地址包括節(jié)點號、模塊號、SAP號。模塊的所有SAP都通過SAP標識注冊到與其相對應(yīng)的節(jié)點的名字服務(wù)器上。例如,在圖6中,各模塊以及其包含的SAP都掛在相應(yīng)的Node0下面。此外,在名字服務(wù)模塊上還記錄了實際要訪問地址(如物理地址)。在具體訪問時,例如在訪問時通過名字服務(wù)根據(jù)服務(wù)SAP的分層地址,得出它的實際訪問地址,然后根據(jù)實際訪問地址訪問。
在模塊中,SAP標識一般保存在特定位置,例如在本發(fā)明的一個實施方式中,SAP標識保存在模塊中的一個專用的SAP列表存儲器中。在系統(tǒng)初始啟動時,模塊會訪問SAP列表存儲器,并根據(jù)SAP存儲器中的記錄,對記錄的SAP進行初始化。模塊在關(guān)閉時會根據(jù)SAP存儲器中的記錄注銷這些SAP。當然,本發(fā)明并不局限于此,本領(lǐng)域的技術(shù)人員應(yīng)該理解還具有許多其他的存儲方法。
同步消息發(fā)送器發(fā)送同步消息至目的SAP,請求所需服務(wù),并將服務(wù)結(jié)果返回給發(fā)送者。異步消息發(fā)送器,發(fā)送異步消息至目的SAP,請求所需服務(wù),但不負責將服務(wù)結(jié)果返回給發(fā)送者。同步消息接收單元接收服務(wù)請求方的同步消息,調(diào)用相應(yīng)的服務(wù)執(zhí)行單元完成所需服務(wù),將服務(wù)結(jié)果返回給服務(wù)請求方。異步消息接收和調(diào)度單元,接收服務(wù)請求方的同步消息,并分發(fā)給相應(yīng)的服務(wù)執(zhí)行單元,待所述服務(wù)執(zhí)行單元完成服務(wù)后,創(chuàng)建一個新的消息,將服務(wù)結(jié)果放在新的消息中通過消息發(fā)送器發(fā)送給服務(wù)請求方。
所述服務(wù)接入點在所述系統(tǒng)內(nèi)具有唯一的全局分層地址都以其全局分層地址注冊到名字服務(wù)器模塊,消息發(fā)送器根據(jù)注冊到名字服務(wù)器上的全局分層地址向服務(wù)接入點發(fā)送消息。由于采用了全局分層地址,不同節(jié)點中的模塊也可以通過上述相同的方式互相進行訪問。
在該實施方式中,同步消息和異步消息都包括消息頭和消息體,消息頭中至少包含客戶端模塊的地址、服務(wù)端地址以及服務(wù)端模塊的SAP號,消息體則封裝調(diào)用數(shù)據(jù)。
在下文中,為了便于描述,將發(fā)送消息的模塊稱為客戶端模塊,將接受消息的模塊稱為服務(wù)端模塊。各模塊既可以是客戶端模塊,也可以是服務(wù)端模塊。
在進行同步調(diào)用時,客戶端模塊的消息發(fā)送器(具體地說,是通過同步消息發(fā)送器)向服務(wù)端模塊的SAP發(fā)送同步消息。服務(wù)端模塊通過其具有的SAP(具體地說,是接收和調(diào)度單元的同步接收和調(diào)度單元)接收該同步消息,并將所接收到的同步消息發(fā)送到相應(yīng)的執(zhí)行單元,執(zhí)行單元根據(jù)接收到的同步消息的消息體中的具體內(nèi)容來完成相應(yīng)的功能操作,并將操作的結(jié)果返回到客戶端模塊。在這里返回的結(jié)果同樣是由客戶端模塊的SAP的接收和調(diào)度單元來接收的。在進行異步調(diào)用時,客戶端模塊的消息發(fā)送器(具體地說,是通過異步消息發(fā)送器)向服務(wù)端模塊的SAP發(fā)送異步消息,同樣,服務(wù)端模塊通過其具有的異步消息接收和調(diào)度單元接收該異步消息,并將所接收到的異步消息發(fā)送到相應(yīng)的執(zhí)行單元,該執(zhí)行單元根據(jù)接收到的異步消息體中的具體內(nèi)容來完成相應(yīng)的功能操作。但是,服務(wù)端模塊在完成相應(yīng)的操作后,并不會給客戶端模塊返回操作結(jié)果。但是,服務(wù)端的SAP會從接收到的異步消息中獲取客戶端源地址,并對其進行保存。之后,客戶端的SAP在任意需要的時候,可以創(chuàng)建新的消息,并將服務(wù)端模塊的服務(wù)結(jié)果放入新的消息中,根據(jù)該客戶端的源地址,向客戶端模塊返回操作的結(jié)果。在這里,在調(diào)用過程中所使用的數(shù)據(jù)可以是二進制數(shù)據(jù),并可以使用分布式開發(fā)中的各種編碼方式,例如使用CDR或ASN.1編碼方式。
此外,各模塊還可以包括一個管理SAP的單元,用來完成一些所有SAP的共性的管理功能。
在本發(fā)明的另外一個優(yōu)選實施方式中,在節(jié)點中還可以設(shè)有一個備份模塊,備份模塊同原始模塊完全相同,備份模塊的模塊號也同該模塊的相同。在該實施方式中,上述分層地址還可包括一個“群內(nèi)號”,用于區(qū)分原始模塊和備份模塊。
下面描述一種在根據(jù)本發(fā)明上述實施方式描述的分布式系統(tǒng)中利用消息進行通信的方法。
首先,上述節(jié)點中的一個(在這里稱為第一節(jié)點)的一個模塊(在這里稱為第一模塊)通過與其對應(yīng)的消息發(fā)送器向另外一個節(jié)點(在這里稱為第二節(jié)點)的一個模塊(在這里稱為第二模塊)發(fā)送消息。第二模塊通過與其對應(yīng)的SAP接收該消息,并根據(jù)所接受的消息是同步消息還是異步消息來執(zhí)行相應(yīng)操作。其中在第一模塊向第二模塊發(fā)送的消息為同步消息時,第二模塊向第一模塊返回操作結(jié)果,在第一模塊向第二模塊發(fā)送的消息為異步消息時,第二模塊根據(jù)所述消息執(zhí)行相應(yīng)操作,但不向第一模塊返回操作結(jié)果,而僅保存第一模塊的地址。在需要的時候,第二模塊可以根據(jù)包括的第一模塊的地址向第一模塊返回操作結(jié)果。對于具體的操作過程可參照上文中的描述。
在這里雖然列舉了兩個節(jié)點之間的兩個模塊之間進行通信的方法,但是本領(lǐng)域的技術(shù)人員應(yīng)該認識到在同一節(jié)點中的兩個不同模塊也可以進行上述相同的操作。此外,對于上述操作的具體原理和細節(jié)已經(jīng)在前面描述本發(fā)明優(yōu)選實施方式的分布式系統(tǒng)時進行了詳細的論述,因此,在這里不再贅述。
為了使本領(lǐng)域的技術(shù)人員更加完整地理解本發(fā)明,下面以C++語言編程為例來詳細描述實現(xiàn)本發(fā)明優(yōu)選實施方式的模塊的細節(jié)。
為了使本發(fā)明的技術(shù)人員更容易地理解本發(fā)明,下面將以C++語言編程為例以軟件實現(xiàn)的形式來說明本發(fā)明實施方式的一個示例。圖8是用C++語言編程實現(xiàn)一個模塊的實例的結(jié)構(gòu)示意圖。在圖中,iMAP_Lem_Module表示模塊的類名稱,iMAP_Msg_Utility表示消息發(fā)送器的類名稱,iMAP_Sap_Cache_Mgr和Sap_Entry分別表示服務(wù)接入點緩存管理器的類名稱和服務(wù)接入點列表的類名稱。此外,iMAP_Lem_Sap_Impl和iMAP_Admin_Sap_Impl分別表示服務(wù)接入點實現(xiàn)基類的類名稱和管理服務(wù)接入點實現(xiàn)的類名稱。圖中的連線表示了各類之間的調(diào)用關(guān)系。圖中的英文是訪問時調(diào)用的名稱,沒有特別的含義,也可以用其他的英文名稱替代。
其中,各模塊可以通過包含有進程、動態(tài)庫或其他形式的單元來實現(xiàn),如前所述,每個模塊都有一個唯一的“模塊號”,用于和節(jié)點內(nèi)其他模塊相區(qū)別。這些模塊作為SAP的容器完成模塊全局的初始化和SAP的初始化。模塊主體通過消息發(fā)送器向其他模塊的SAP發(fā)送消息來訪問其他模塊。如上所述,服務(wù)接入點緩存管理器由消息發(fā)送器使用。服務(wù)接入點列表用于存儲該模塊中所有的SAP地址,服務(wù)接入點列表在模塊初始化時被初始化。管理服務(wù)接入點實現(xiàn)類,可以完成一些所有SAP的共性的管理功能。
SAP從iMAP_Lem)_Sap_Impl派生。SAP提供模塊對外接口的實體,SAP有一個唯一的“SAP號”,和本模塊的其他SAP相區(qū)別。SAP實現(xiàn)一個CORBA接口,并注冊到名字服務(wù)器,使用[節(jié)點號][模塊號][SAP號]來作為該SAP的外部標識(名字)。
SAP實現(xiàn)的CORBA接口為一個通用的接口,而應(yīng)用層的SAP一般會提供多個功能,每個功能用一個成員函數(shù)實現(xiàn)。應(yīng)用定義成員函數(shù),同時定義一個分發(fā)ID(分發(fā)碼)。iMAP_Lem_Sap_Impl通過分發(fā)ID查找和調(diào)用分發(fā)成員函數(shù)。成員函數(shù)使用宏定義。
上述模塊類和SAP類封裝了服務(wù)端的開發(fā),消息發(fā)送器提供了客戶端的使用,客戶端使用這個類對象發(fā)送同步或異步消息。
模塊類和SAP類中都有獲得iMAP_Msg_Utility實例的函數(shù)。消息發(fā)送器的關(guān)鍵是SAP緩存管理器iMAP_Sap_Cache_Mgr,該類提供SAP的CORBA對象的緩存。這個類的核心是一個SAP的緩存數(shù)組。
從上述內(nèi)容不難看出,本實例中的技術(shù)方案簡化了分布式開發(fā)的步驟,降低了分布式開發(fā)的難度,由于iMAP_Lem_Module封裝了CORBA對象的創(chuàng)建和注冊、注銷,用戶只要專注于SAP的實現(xiàn);SAP只是一個普通的C++類,從iMAP_Lem_Sap_Impl派生,用戶只需要定義分發(fā)碼和實現(xiàn)成員函數(shù),而不需要定義和實現(xiàn)任何CORBA接口。而發(fā)送消息統(tǒng)一使用iMAP_Msg_Utility類,用戶也不用關(guān)心對端的CORBA對象和名字服務(wù)器,只需要知道對端的SAP標識。
本實例中的方案提供了更好的擴充性和可靠性,由于發(fā)送消息統(tǒng)一在iMAP_Msg_Utility中實現(xiàn),消息接受統(tǒng)一在iMAP_Lem_Sap_Impl中,消息有統(tǒng)一的消息頭,可以對消息進行一些統(tǒng)一的處理,進行一些AOP(AspectOriented Programing,面向方面的編程),如統(tǒng)一記錄日志。由于消息統(tǒng)一入口、出口和消息頭,可以統(tǒng)一記錄運行日志。
此外,如果直接使用CORBA開發(fā),對每個接口定義一個IDL,然后編譯成stub(代理)和skeleton(骨架),這些代碼量很大,一個簡單的接口可能編譯出1000行以上代碼,造成系統(tǒng)很龐大,在本實施例中,只有一個系統(tǒng)預(yù)定義的CORBA接口,新增的功能通過用戶派生類實現(xiàn)自己的業(yè)務(wù)邏輯,沒有額外的代碼,系統(tǒng)的大小可以控制,在一些嵌入式的系統(tǒng)由于內(nèi)存受限制,可以通過本發(fā)明提供的方案實現(xiàn)很好的分布式特性。
上述實例中,可以使用ORB(CORBA里面的對象遠程代理)進行底層的通信承載,但在本發(fā)明的系統(tǒng)中ORB不是必須的,也可以使用其他方式作為通信的承載。包括但不限于ACE Reactor/EventHandler(ACE Reactor,Adaptive Communication Envionment Reactor/EventHandler,自適應(yīng)通信環(huán)境反應(yīng)器/事件處理器;是ACE里面的一個設(shè)計模式,對Socket-即套接字的一種C++封裝,ACE是一套開源代碼。);ICE(Internet CommunicationEnvironment,因特網(wǎng)通信環(huán)境,也是一套開源代碼,是CORBA的簡化版本);Socket(套接字,是針對IP通信的最廣泛使用的一套編程接口)等,都可以實現(xiàn)本發(fā)明的系統(tǒng)。
圖9表示本方案的一個同步調(diào)用的過程。下面參照圖8和圖9詳細描述本發(fā)明一個實施方式的同步調(diào)用過程,其步驟如下步驟901Client(客戶端,即調(diào)用者)使用消息發(fā)送器(iMAP_Msg_Utility)發(fā)送同步消息(Send_sync_msg,消息發(fā)送器提供的接口函數(shù));步驟902iMAP_Msg_Utility對Server(服務(wù)端)的iMAP_Lem_Servant(侍服類)執(zhí)行同步調(diào)用(InvokeSnyc,同步調(diào)用,底層CORBA接口調(diào)用);步驟903iMAP_Lem_Servant對iMAP_Lem_Sap_Impl執(zhí)行同步調(diào)用(iMAP_Lem_Servant實際和iMAP_Lem_Sap_Impl可以是一個類,分成兩個僅僅是一種實現(xiàn)上的解耦方法,可以看成是一個,前者僅起一個代理作用);步驟904iMAP_Lem_Sap_Impl在映射中查找分發(fā)函數(shù)(find_map,分發(fā)函數(shù),是服務(wù)接入點類的一個成員函數(shù)),服務(wù)接入點根據(jù)消息頭中的分發(fā)碼,找到分發(fā)函數(shù);步驟905iMAP_Lem_Sap_Impl執(zhí)行分發(fā)函數(shù);步驟906iMAP_Lem_Sap_Impl同步調(diào)用結(jié)束,將該調(diào)用的輸出參數(shù)和返回值返回給iMAP_Lem_Servant;步驟907iMAP_Lem_Servant同步調(diào)用結(jié)束,將該調(diào)用的輸出參數(shù)和返回值返回給iMAP_Msg_Utility(即Send_sync_msg函數(shù)的輸出參數(shù)和返回值);步驟908iMAP_Msg_Utility同步消息結(jié)束,Client獲得調(diào)用結(jié)果。
圖10表示了本方案的一個異步調(diào)用的過程實例,下面參照圖8和圖10詳細描述本發(fā)明一個實施方式的異步調(diào)用過程,其步驟如下步驟1001Client(客戶端,即調(diào)用者)使用消息發(fā)送器(iMAP_Msg_Utility)發(fā)送異步消息(send_async_msg,消息發(fā)送器提供的接口函數(shù));步驟1002iMAP_Msg_Utility對Server(服務(wù)端)的iMAP_Lem_Servant(侍服類)執(zhí)行異步調(diào)用(InvokeAsync,異步調(diào)用,底層CORBA接口調(diào)用);步驟1003iMAP_Lem_Servant對iMAP_Lem_Sap_Impl執(zhí)行異步調(diào)用;步驟1004iMAP_Lem_Sap_Impl在映射中查找分發(fā)函數(shù);步驟1005iMAP_Lem_Sap_Impl不執(zhí)行分發(fā)函數(shù),把調(diào)用打包放進隊列。打包放進隊列過程是把找到的分發(fā)函數(shù)指針、異步調(diào)用的消息頭和消息體放在一個數(shù)據(jù)結(jié)構(gòu)里面,然后把這個結(jié)構(gòu)放進一個隊列;步驟1006iMAP_Lem_Sap_Impl異步調(diào)用結(jié)束,將返回結(jié)果(不帶有該調(diào)用的輸出參數(shù)和返回值)返回給iMAP_Lem_Servant;步驟1007iMAP_Lem_Servant異步調(diào)用結(jié)束,將返回結(jié)果(不帶有該調(diào)用的輸出參數(shù)和返回值)返回給iMAP_Msg_Utility;步驟1008iMAP_Msg_Utility異步消息結(jié)束,將返回結(jié)果返回給Client。
步驟1009iMAP_Lem_Sap_Impl通過Svc(線程函數(shù))論詢上述隊列,如果隊列不為空,則取出隊列的內(nèi)容(分發(fā)函數(shù)指針、消息頭、消息體),通過分發(fā)函數(shù)指針,執(zhí)行該分發(fā)函數(shù),執(zhí)行時消息頭、消息體作為分發(fā)函數(shù)的參數(shù)傳入。
步驟1010Svc(線程函數(shù))獲得步驟1009中分發(fā)函數(shù)執(zhí)行的結(jié)果,結(jié)果包括兩部分函數(shù)返回值,函數(shù)輸出參數(shù)。
步驟1011Svc使用Server(服務(wù)端)的iMAP_Msg_Utility的異步函數(shù)(send_async_msg)給Client發(fā)送結(jié)果(返回值填在消息頭中,輸出參數(shù)作為消息體);Client端實際也是在一個iMAP_Lem_Sap_Impl的實現(xiàn)里面處理步驟1011的結(jié)果。
此處還需要規(guī)定一個特殊值比如發(fā)函數(shù)如果返回空值(DISP VOID),表示不需要Svc函數(shù)再執(zhí)行步驟1011,將返回空值作為一個特殊定義,分發(fā)函數(shù)的其他返回值不能使用這個值。
當Client的iMAP_Lem_Sap_Impl在收到Server的iMAP_Msg_Utility發(fā)送的消息后,Client端的iMAP_Lem_Sap_Impl的分發(fā)函數(shù)會返回空值,從而避免形成一個死循環(huán)的消息發(fā)送。
圖11表示本方案的一種在HA上的應(yīng)用實例。如圖中所示,在HA方式中,模塊有兩個運行實例,一個是主(Active),一個是備(Standby),這兩個實例的節(jié)點號、模塊號都一樣,但兩個的“群內(nèi)號”不一樣,如,一個是0一個是1。對于調(diào)用者,他只看到節(jié)點號、模塊號、SAP號,因此HA對于調(diào)用者是透明的。調(diào)用者把目的節(jié)點號、模塊號、SAP號傳給消息發(fā)送器,后者在調(diào)用時中查詢這兩個實例的狀態(tài),如果發(fā)現(xiàn)一個是主,一個是備,則給主和備實例同時發(fā)送(即同時調(diào)用主和備實例的SAP的CORBA函數(shù)),這樣實現(xiàn)復(fù)制功能(Duplication function)。
這是實現(xiàn)雙機熱備份的一種機制,也叫做并發(fā)選收。即發(fā)送的時候給主備對象都發(fā)送,但主、備對象處理后,只有主的返回消息發(fā)出來(如果兩個的消息都發(fā)出來就會造成混亂),而備的消息不發(fā)出來,如圖中虛線部分,這樣實現(xiàn)選擇功能(selection function)。
如此,可以保證在主、備對象中,如果有一個死了,另外一個還能不中斷地進行處理。比如當主對象死了,這時原先備的對象變成了主對象,可以發(fā)送消息,而原先的主對象變成了備對象。
主、備作為整體來講,始終有一個輸入和一個輸出。輸入和輸出包括任何內(nèi)容,當對應(yīng)文件時,輸入就是讀文件,輸出就是寫文件;當對應(yīng)數(shù)據(jù)庫時,輸入就是查詢,輸出就是增刪改。
以上所述的實施例,只是本發(fā)明較優(yōu)選的具體實施方式
的一種,本領(lǐng)域的技術(shù)人員在本發(fā)明技術(shù)的方案范圍內(nèi)進行的通常變化和替換,都應(yīng)包含在本發(fā)明的保護范圍內(nèi)。
權(quán)利要求
1.一種基于消息的分布式系統(tǒng),其特征在于,所述系統(tǒng)包括至少一個節(jié)點,所述節(jié)點包括至少一個完成特定功能的模塊,所述模塊包括至少一個服務(wù)接入點,用于接收服務(wù)請求消息,并根據(jù)所述服務(wù)請求消息完成所需服務(wù);消息發(fā)送器,用于將服務(wù)請求消息發(fā)送至目的服務(wù)接入點,請求所需服務(wù)。
2.如權(quán)利要求1所述的系統(tǒng),其特征在于,所述服務(wù)接入點具有在所述系統(tǒng)內(nèi)唯一的服務(wù)接入點標識;所述消息中包含目的服務(wù)接入點的標識。
3.如權(quán)利要求1所述的系統(tǒng),其特征在于,所述消息發(fā)送器包括同步消息發(fā)送器,用于將同步消息發(fā)送至目的服務(wù)接入點,請求所需服務(wù),并將服務(wù)結(jié)果返回給發(fā)送者;異步消息發(fā)送器,用于將異步消息發(fā)送至目的服務(wù)接入點,請求所需服務(wù),但不負責將服務(wù)結(jié)果返回給發(fā)送者。
4.如權(quán)利要求1所述的系統(tǒng),其特征在于,所述服務(wù)接入點包括至少一個服務(wù)執(zhí)行單元,根據(jù)服務(wù)請求消息完成所需服務(wù);消息接收和調(diào)度單元,接收服務(wù)請求消息,并分發(fā)給相應(yīng)的服務(wù)執(zhí)行單元,將服務(wù)結(jié)果返回給服務(wù)請求方。
5.如權(quán)利要求4所述的系統(tǒng),其特征在于,所述消息接收和調(diào)度單元具體包括同步消息接收和調(diào)度單元,接收服務(wù)請求方的同步消息,調(diào)用相應(yīng)的服務(wù)執(zhí)行單元完成所需服務(wù),將服務(wù)結(jié)果返回給服務(wù)請求方。異步消息接收和調(diào)度單元,接收服務(wù)請求方的同步消息,并分發(fā)給相應(yīng)的服務(wù)執(zhí)行單元,待所述服務(wù)執(zhí)行單元完成服務(wù)后,創(chuàng)建新消息,將服務(wù)結(jié)果放在所述新消息中通過消息發(fā)送器發(fā)送給服務(wù)請求方。
6.如權(quán)利要求2所述的系統(tǒng),其特征在于,所述節(jié)點還包括名字服務(wù)器,用于提供名字服務(wù);所述服務(wù)接入點將該服務(wù)接入點的標識及訪問地址注冊到所述名字服務(wù)器;所述消息發(fā)送器根據(jù)消息中的目的服務(wù)接入點標識從名字服務(wù)器得到目的服務(wù)接入點的訪問地址,將消息發(fā)送至目的服務(wù)接入點。
7.如權(quán)利要求2所述的系統(tǒng),其特征在于,所述消息包括消息頭和消息體,所述消息頭中至少包含發(fā)送所述消息的服務(wù)接入點標識,以及接收所述消息的服務(wù)接入點標識,所述消息體包含有服務(wù)需要的數(shù)據(jù)。
8.如權(quán)利要求2所述的系統(tǒng),其特征在于,所述服務(wù)接入點標識由節(jié)點號、模塊號和服務(wù)接入點號組成。
9.如權(quán)利要求1所述的系統(tǒng),其特征在于,所述模塊還設(shè)有一個備份模塊。
10.如權(quán)利要求1所述的系統(tǒng),其特征在于,所述模塊還包括服務(wù)接入點列表存儲器,用于存儲所述模塊中的所有服務(wù)接入點。
11.如權(quán)利要求1所述的系統(tǒng),其特征在于,所述模塊還包括一個服務(wù)接入點管理單元,用來管理所述模塊中的所有服務(wù)接入點。
12.一種在分布式系統(tǒng)中利用消息進行通信的方法,用于第一服務(wù)接入點向第二服務(wù)接入點請求服務(wù),其特征在于,所述方法包括以下步驟1)所述第一服務(wù)接入點通過消息發(fā)送器向所述第二服務(wù)接入點發(fā)送消息;2)所述第二服務(wù)接入點接收消息,執(zhí)行所需服務(wù);3)所述第二服務(wù)接入點返回服務(wù)結(jié)果。
13.如權(quán)利要求12所述的方法,其特征在于,所述消息為同步消息,所述步驟2)具體為所述第二服務(wù)接入點接收消息,調(diào)用相應(yīng)服務(wù)執(zhí)行單元,完成所需服務(wù)。
14.如權(quán)利要求12所述的方法,其特征在于,所述消息為異步消息,所述步驟2)具體為所述第二服務(wù)接入點將所述消息發(fā)送給相應(yīng)的服務(wù)執(zhí)行單元,所述服務(wù)執(zhí)行單元完成所需服務(wù)。
15.如權(quán)利要求14所述的方法,其特征在于,所述步驟3)具體為所述第二服務(wù)接入點創(chuàng)建新的消息,將服務(wù)結(jié)果放入所述新消息中,通過消息發(fā)送器發(fā)送給所述第一服務(wù)接入點。
16.如權(quán)利要求12所述的方法,其特征在于,所述消息包括消息頭和消息體,所述消息頭中至少包含發(fā)送所述消息的服務(wù)接入點標識,以及接收所述消息的服務(wù)接入點標識,所述消息體包含有服務(wù)需要的數(shù)據(jù)。
17.如權(quán)利要求12所述的方法,其特征在于,所述服務(wù)入點標識由節(jié)點號、模塊號和服務(wù)接入點號組成。
18.如權(quán)利要求17所述的方法,其特征在于,所述模塊還設(shè)有一個備份模塊,所述步驟1)具體為所述第一服務(wù)接入點通過消息發(fā)送器向第二服務(wù)接入點請求服務(wù),所述消息發(fā)送器向位于所有模塊的所述第二服務(wù)接入點分別發(fā)送請求所述服務(wù)的消息。所述步驟3)具體為位于非備份模塊的所述第二服務(wù)接入點返回服務(wù)結(jié)果。
全文摘要
本發(fā)明提出了一種基于消息的分布式系統(tǒng)以及在其中進行通信的方法,所述系統(tǒng)包括至少一個節(jié)點,所述節(jié)點包括至少一個完成特定功能的模塊,所述模塊包括至少一個服務(wù)接入點,用于接收服務(wù)請求消息,并根據(jù)所述服務(wù)請求消息完成所需服務(wù);消息發(fā)送器,用于將服務(wù)請求消息發(fā)送至目的服務(wù)接入點請求所需服務(wù)。利用本發(fā)明,發(fā)送消息統(tǒng)一使用消息發(fā)送器,接受消息統(tǒng)一使用服務(wù)點接入單元,用戶不用關(guān)心具體信息,只需要知道對端的接入服務(wù)點標識就能夠完成在分布式環(huán)境下的通信,簡化了開發(fā)的難度,提高了系統(tǒng)的可靠性和可擴充性。
文檔編號H04L29/08GK1984149SQ20061007598
公開日2007年6月20日 申請日期2006年4月27日 優(yōu)先權(quán)日2006年4月27日
發(fā)明者徐彬艷 申請人:華為技術(shù)有限公司