輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)通信技術(shù)領(lǐng)域,特別涉及一種輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn) 方法及系統(tǒng)。
【背景技術(shù)】
[0002] 消息中間件(MOM,Message-orientedmiddle-ware)是一種利用高效可靠的消息 傳遞機(jī)制進(jìn)行與平臺(tái)無(wú)關(guān)的數(shù)據(jù)通信,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)集成的軟件。它 通過(guò)將信息以消息(該消息除包含了應(yīng)用程序處理所需的數(shù)據(jù)外還應(yīng)該包含其它成分,例 如消息的發(fā)送者、接收者,消息的一些控制信息)的形式,從一個(gè)應(yīng)用程序傳送到另一個(gè)或 多個(gè)應(yīng)用程序。消息中間件在TCP/IP網(wǎng)絡(luò)體系結(jié)構(gòu)中處于應(yīng)用層,網(wǎng)絡(luò)應(yīng)用程序建立在消 息中間件之上,實(shí)現(xiàn)各種分布式應(yīng)用服務(wù)。
[0003] 在使用過(guò)程中,現(xiàn)有的消息中間件存在以下問(wèn)題:
[0004] 1.嵌入了大量的第三方庫(kù),造成使用該消息中間件的應(yīng)用程序變得體積臃腫,編 譯速度變慢;
[0005] 2.通常對(duì)Windows和Unix支持較好,對(duì)Vxworks平臺(tái)支持不足;
[0006] 3.大文件消息傳輸能力較差,報(bào)文傳輸?shù)拈L(zhǎng)度有限制;
[0007] 4.使用過(guò)程繁瑣,消息中間件在通信過(guò)程中需要?jiǎng)?chuàng)建、保持和關(guān)閉連接,對(duì)于需要 頻繁使用消息中間件的應(yīng)用,需要不斷重復(fù)這一過(guò)程,增加了開發(fā)者的負(fù)擔(dān)。
【發(fā)明內(nèi)容】
[0008] 有鑒于此,本發(fā)明提供一種輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)方法及系統(tǒng)。
[0009] -種輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)方法,包括如下步驟:
[0010] S1、配置路由表,路由表包括進(jìn)程ID、IP地址、組播地址路由關(guān)系信息,消息中間 件根據(jù)路由表解析出消息轉(zhuǎn)發(fā)控制規(guī)則;
[0011] S2、初始化應(yīng)用進(jìn)程,創(chuàng)建該進(jìn)程通信所需要的相關(guān)資源;
[0012] S3、消息隊(duì)列接收線程實(shí)現(xiàn):調(diào)用消息隊(duì)列接收函數(shù),將消息隊(duì)列接收線程阻塞, 如消息隊(duì)列收到數(shù)據(jù),將數(shù)據(jù)拷貝至進(jìn)程專屬緩沖區(qū)中,并改寫消息隊(duì)列"讀"與"寫"管道 狀態(tài);
[0013] S4、進(jìn)程讀取數(shù)據(jù)接口實(shí)現(xiàn):利用P0SIX庫(kù)的I/O復(fù)用Select函數(shù),輪詢消息隊(duì)列 "寫"管道、UDP通信Socket和TCP通信Socket,如收到數(shù)據(jù)則將數(shù)據(jù)拷貝至進(jìn)程專屬緩沖 區(qū)中,并改寫消息隊(duì)列"讀"與"寫"管道狀態(tài);
[0014] S5、進(jìn)程發(fā)送數(shù)據(jù)接口實(shí)現(xiàn):根據(jù)發(fā)送報(bào)文頭中的發(fā)送進(jìn)程ID以及預(yù)先配置的路 由表,判斷通信發(fā)生在節(jié)點(diǎn)間還是節(jié)點(diǎn)內(nèi);根據(jù)發(fā)送報(bào)文長(zhǎng)度,判斷通信方式采用UDP還是 TCP;
[0015] S6、TCP組播線程池的實(shí)現(xiàn):根據(jù)預(yù)先配置的路由表,解析組播地址中包括的IP地 址,創(chuàng)建TCP發(fā)送線程池,并通過(guò)TCP發(fā)送線程池完成多地址TCP報(bào)文發(fā)送的并行處理。
[0016] -種輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)系統(tǒng),包括如下模塊:
[0017] 路由表配置模塊,用于配置路由表,路由表包括進(jìn)程ID、IP地址、組播地址路由關(guān) 系信息,消息中間件根據(jù)路由表解析出消息轉(zhuǎn)發(fā)控制規(guī)則;
[0018] 進(jìn)程初始化模塊,用于初始化應(yīng)用進(jìn)程,創(chuàng)建該進(jìn)程通信所需要的相關(guān)資源;
[0019]消息隊(duì)列接收線程模塊,用于調(diào)用消息隊(duì)列接收函數(shù),將消息隊(duì)列接收線程阻塞, 如消息隊(duì)列收到數(shù)據(jù),將數(shù)據(jù)拷貝至進(jìn)程專屬緩沖區(qū)中,并改寫消息隊(duì)列"讀"與"寫"管道 狀態(tài);
[0020] 進(jìn)程讀取數(shù)據(jù)接口模塊,用于利用P0SIX庫(kù)的I/O復(fù)用Select函數(shù),輪詢消息隊(duì) 列"寫"管道、UDP通信Socket和TCP通信Socket,如收到數(shù)據(jù)則將數(shù)據(jù)拷貝至進(jìn)程專屬緩 沖區(qū)中,并改寫消息隊(duì)列"讀"與"寫"管道狀態(tài);
[0021] 進(jìn)程發(fā)送數(shù)據(jù)接口模塊,用于根據(jù)發(fā)送報(bào)文頭中的發(fā)送進(jìn)程ID以及預(yù)先配置的 路由表,判斷通信發(fā)生在節(jié)點(diǎn)間還是節(jié)點(diǎn)內(nèi);根據(jù)發(fā)送報(bào)文長(zhǎng)度,判斷通信方式采用UDP還 是TCP;
[0022] TCP組播線程池模塊,用于根據(jù)預(yù)先配置的路由表,解析組播地址中包括的IP地 址,創(chuàng)建TCP發(fā)送線程池,并通過(guò)TCP發(fā)送線程池完成多地址TCP報(bào)文發(fā)送的并行處理。
[0023] 本發(fā)明提供的輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)方法及系統(tǒng),具有如下優(yōu)點(diǎn):
[0024] 1)使用操作系統(tǒng)自帶P0SIX庫(kù),而非依賴外部第三方庫(kù),實(shí)現(xiàn)了消息中間件的輕 量化;
[0025] 2)通過(guò)I/O復(fù)用及管道等技術(shù)封裝消息隊(duì)列、UDP、TCP等進(jìn)程通信方式,屏蔽了以 上進(jìn)程通信方式使用上的差異,實(shí)現(xiàn)了通信框架跨平臺(tái)(Windows、Unix和Vxworks)使用以 及通信接口上的統(tǒng)一;
[0026] 3)使用預(yù)設(shè)路由表,控制消息轉(zhuǎn)發(fā)規(guī)則,屏蔽了通信物理位置上的差異。用戶只需 關(guān)心通信的內(nèi)容,消息中間件可自動(dòng)處理并選擇通信策略,并發(fā)送到相應(yīng)的目的地。
[0027] 保證了進(jìn)行通信交互策略的透明性、平臺(tái)的無(wú)關(guān)性。
【附圖說(shuō)明】
[0028]圖1為本發(fā)明實(shí)施例的輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)方法流程圖;
[0029] 圖2為圖1中步驟S2的子流程圖;
[0030]圖3為本發(fā)明實(shí)施例的輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)系統(tǒng)結(jié)構(gòu)框圖;
[0031]圖4是圖3中進(jìn)程初始化模塊的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0032] 如圖1所示,一種輕量級(jí)跨平臺(tái)消息中間件的實(shí)現(xiàn)方法,包括如下步驟:
[0033]S1、配置路由表,路由表包括進(jìn)程ID、IP地址、組播地址路由關(guān)系信息,消息中間 件根據(jù)路由表解析出消息轉(zhuǎn)發(fā)控制規(guī)則。
[0034] 分布式系統(tǒng)中每個(gè)節(jié)點(diǎn)在應(yīng)用本消息中間件時(shí),預(yù)先編輯信息轉(zhuǎn)發(fā)路由表,消息 中間件通過(guò)解析該路由表,明確系統(tǒng)中的進(jìn)程與節(jié)點(diǎn)部署關(guān)系,明確組播地址配置情況。
[0035] 分布式系統(tǒng)中各節(jié)點(diǎn)的進(jìn)程ID :
[0036]
[0037]
[0038] IP地址、組播地址路由關(guān)系信息:
[0039]
[0040] S2、初始化應(yīng)用進(jìn)程,創(chuàng)建該進(jìn)程通信所需要的相關(guān)資源;
[0041] 可選地,如圖2所示,所述步驟S2包括如下子步驟:
[0042] S21、初始化進(jìn)程通信所需的緩沖區(qū)及緩沖區(qū)長(zhǎng)度。
[0043] S22、創(chuàng)建消息隊(duì)列的"讀/寫"管道以及相應(yīng)的文件描述符。
[0044] 通過(guò)"讀/寫"管理標(biāo)記消息隊(duì)列接收或讀取數(shù)據(jù),將管道的文件描述符作為I/O 復(fù)用函數(shù)Select的參數(shù);Select函數(shù)允許進(jìn)程指示內(nèi)核等待消息隊(duì)列、UDP通信Socket、 TCP通信Socket中任意一個(gè)接收到數(shù)據(jù),并僅在一個(gè)或多個(gè)事件發(fā)生或經(jīng)過(guò)預(yù)先指定的時(shí) 間后才喚醒進(jìn)程。
[0045] S23、創(chuàng)建節(jié)點(diǎn)間短報(bào)文通信所需的UDP通信Socket。
[0046] 分別創(chuàng)建UDP通信接收和發(fā)送Socket,并根據(jù)進(jìn)程ID為每個(gè)進(jìn)程分配唯一的端口 號(hào),將接收Socket與接收端口號(hào)綁定。
[0047]S24、創(chuàng)建節(jié)點(diǎn)間短報(bào)文通信所需的TCP通信Socket。
[0048] 分別創(chuàng)建TCP通信接收和發(fā)送Socket,并根據(jù)進(jìn)程ID為每個(gè)進(jìn)程分配唯一的端口 號(hào),將接收Socket與接收端口號(hào)綁定。
[0049] S25、創(chuàng)建消息隊(duì)列接收線程。
[0050] 創(chuàng)建一個(gè)并發(fā)性線程,用于消息隊(duì)列接收數(shù)據(jù)。
[0051] S3、消息隊(duì)列接收線程實(shí)現(xiàn):調(diào)用消息隊(duì)列接收函數(shù),將消息隊(duì)列接收線程阻塞, 如消息隊(duì)列收到數(shù)據(jù),將數(shù)據(jù)拷貝至進(jìn)程專屬緩沖區(qū)中,并改寫消息隊(duì)列"讀"與"寫"管道 狀態(tài)。
[0052] S4、進(jìn)程讀取數(shù)據(jù)接口實(shí)現(xiàn):利用P0SIX庫(kù)的I/O復(fù)用Select函數(shù),輪詢消息隊(duì)列 "寫"管道、UDP通信Socket和TCP通信Socket,如收到數(shù)據(jù)則將數(shù)據(jù)拷貝至進(jìn)程專屬緩沖 區(qū)中,并改寫消息隊(duì)列"讀"與"寫"管道狀態(tài)。
[0053] 可選地,所述步驟S4包括:
[0054] 分配一個(gè)描述字集,并將描述字集初始化。
[0055] 將"讀"管道文件描述符、UDP通信Socket句柄、TCP通信Socket句柄加入到描述 字集;使用Select函數(shù)輪詢描述字集