一種多節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及多節(jié)點(diǎn)之間的業(yè)務(wù)處理,特別涉及一種節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法。
【背景技術(shù)】
[0002]隨著計(jì)算機(jī)以及網(wǎng)絡(luò)的高速發(fā)展,分布式處理系統(tǒng)被大規(guī)模應(yīng)用。分布式系統(tǒng)中某個(gè)節(jié)點(diǎn)為了訪問(wèn)其他機(jī)器節(jié)點(diǎn)的數(shù)據(jù)與資源,一般會(huì)通過(guò)自定義報(bào)文格式的方式進(jìn)行數(shù)據(jù)交互或業(yè)務(wù)處理。這種方式的通信效率非常低而且維護(hù)開發(fā)工作量較大。當(dāng)增加或修改某個(gè)功能時(shí)有可能需要增加新的報(bào)文格式或?qū)σ延械膱?bào)文格式進(jìn)行修改,因此系統(tǒng)中模塊之間的耦合程度較高,獨(dú)立性比較差。如果機(jī)器節(jié)點(diǎn)之間通過(guò)過(guò)程調(diào)用的方式來(lái)訪問(wèn)其他機(jī)器節(jié)點(diǎn)的數(shù)據(jù)與資源,就可以大大降低進(jìn)程實(shí)現(xiàn)的復(fù)雜度,從而降低進(jìn)程之間的耦合性,讓系統(tǒng)設(shè)計(jì)變得更加簡(jiǎn)單。從某種意義上來(lái)講,遠(yuǎn)程過(guò)程調(diào)用可看作是把分割的程序通過(guò)網(wǎng)絡(luò)進(jìn)行重組的過(guò)程。通過(guò)遠(yuǎn)程過(guò)程調(diào)用,當(dāng)要訪問(wèn)其他機(jī)器系統(tǒng)上數(shù)據(jù)的時(shí)候就不需每次拷貝整個(gè)數(shù)據(jù)庫(kù)或它的大部分程序到用戶系統(tǒng),遠(yuǎn)程機(jī)器節(jié)點(diǎn)只需要處理來(lái)自客戶端的處理請(qǐng)求,甚至只執(zhí)行一些數(shù)據(jù)計(jì)算,把執(zhí)行的結(jié)果再發(fā)送給調(diào)用者。當(dāng)數(shù)據(jù)存放在某個(gè)機(jī)器節(jié)點(diǎn)時(shí),其他機(jī)器節(jié)點(diǎn)可以很方便的通過(guò)遠(yuǎn)程過(guò)程訪問(wèn)其數(shù)據(jù),因此極大提高了分布式系統(tǒng)中計(jì)算機(jī)資源的利用率。
[0003]過(guò)程調(diào)用一般是指將控制從調(diào)用者傳遞到被調(diào)用者,被調(diào)用者在執(zhí)行結(jié)束后將控制交還給調(diào)用者。目前大多數(shù)調(diào)用者和被調(diào)用者是在同一臺(tái)機(jī)器上,它們是在生成可執(zhí)行程序時(shí)由編譯器鏈接起來(lái)的,這種過(guò)程調(diào)用一般稱為本地過(guò)程調(diào)用。遠(yuǎn)程過(guò)程調(diào)用指的是由本地機(jī)器系統(tǒng)上的某個(gè)進(jìn)程激活遠(yuǎn)程機(jī)器系統(tǒng)上的另外一個(gè)進(jìn)程,遠(yuǎn)程系統(tǒng)調(diào)用對(duì)調(diào)用者表現(xiàn)為本地過(guò)程調(diào)用,但實(shí)際上是調(diào)用了遠(yuǎn)程系統(tǒng)上的過(guò)程。
[0004]處理遠(yuǎn)程過(guò)程調(diào)用的進(jìn)程由本地客戶端進(jìn)程和其他機(jī)器節(jié)點(diǎn)進(jìn)程共同作用。遠(yuǎn)程過(guò)程調(diào)用對(duì)于本地客戶端表現(xiàn)為由調(diào)用進(jìn)程在執(zhí)行某個(gè)控制時(shí)首先將過(guò)程調(diào)用需要的參數(shù)以及需要調(diào)用的過(guò)程生成對(duì)應(yīng)的消息,并通過(guò)網(wǎng)絡(luò)發(fā)往其他機(jī)器節(jié)點(diǎn)其他機(jī)器節(jié)點(diǎn)接到消息后調(diào)用相應(yīng)過(guò)程,調(diào)用結(jié)束后將執(zhí)行結(jié)果通過(guò)網(wǎng)絡(luò)發(fā)送至調(diào)用者。
[0005]傳統(tǒng)的過(guò)程調(diào)用是由開發(fā)人員在本地編譯完成,并只能運(yùn)行在本地機(jī)器上,這種結(jié)構(gòu)已經(jīng)無(wú)法適應(yīng)分布式系統(tǒng)應(yīng)用的實(shí)際需求。傳統(tǒng)過(guò)程調(diào)用沒有辦法充分利用網(wǎng)絡(luò)上其他機(jī)器節(jié)點(diǎn)的系統(tǒng)資源,也沒有辦法提高代碼在實(shí)體間的共享程度,使得分布式系統(tǒng)機(jī)器資源沒有得到充分的利用。而遠(yuǎn)程過(guò)程調(diào)用很好地解決了傳統(tǒng)過(guò)程調(diào)用,通過(guò)遠(yuǎn)程調(diào)用可以充分利用非共享內(nèi)存的多處理器環(huán)境并應(yīng)用分布在多臺(tái)機(jī)器節(jié)點(diǎn)上,應(yīng)用程序就像在一個(gè)多處理器的計(jì)算機(jī)上運(yùn)行一樣,可以方便的實(shí)現(xiàn)過(guò)程代碼共享,提高系統(tǒng)資源的利用率。遠(yuǎn)程過(guò)程調(diào)用和通過(guò)定義報(bào)文傳遞處理消息相比,前者語(yǔ)義更加清楚、使用更加簡(jiǎn)單、通用性以及可擴(kuò)展性更強(qiáng),而且有著更高的通信效率。
[0006]當(dāng)在系統(tǒng)或節(jié)點(diǎn)之間采用遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)之后,原先節(jié)點(diǎn)之間的數(shù)據(jù)及操作處理由圖1變成圖2的模式,進(jìn)程在處理其他節(jié)點(diǎn)或進(jìn)程的數(shù)據(jù)就變得和在自己本進(jìn)程內(nèi)處理一樣簡(jiǎn)單,程序代碼更加簡(jiǎn)單,減小了系統(tǒng)設(shè)計(jì)的復(fù)雜性。
【發(fā)明內(nèi)容】
[0007]發(fā)明目的:針對(duì)上述現(xiàn)有技術(shù),提出一種多節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法,通過(guò)遠(yuǎn)程過(guò)程調(diào)用實(shí)現(xiàn)數(shù)據(jù)交互,簡(jiǎn)化業(yè)務(wù)數(shù)據(jù)處理流程。
[0008]技術(shù)方案:一種多節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法,在每個(gè)節(jié)點(diǎn)上設(shè)置數(shù)據(jù)服務(wù)模塊,任一節(jié)點(diǎn)上的數(shù)據(jù)服務(wù)模塊用于實(shí)現(xiàn)該節(jié)點(diǎn)自身進(jìn)程之間的數(shù)據(jù)交互,同時(shí)不同節(jié)點(diǎn)上的數(shù)據(jù)服務(wù)模塊實(shí)現(xiàn)不同節(jié)點(diǎn)進(jìn)程之間的數(shù)據(jù)交互;所述數(shù)據(jù)服務(wù)模塊通過(guò)遠(yuǎn)程過(guò)程調(diào)用協(xié)議實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)交互,所述遠(yuǎn)程過(guò)程調(diào)用協(xié)議的底層通過(guò)Qt元對(duì)象系統(tǒng)實(shí)現(xiàn)。
[0009]進(jìn)一步的,所述遠(yuǎn)程過(guò)程調(diào)用協(xié)議的底層通過(guò)Qt元對(duì)象系統(tǒng)實(shí)現(xiàn)時(shí),Qt元對(duì)象系統(tǒng)中QObject子類的Slot函數(shù)所對(duì)應(yīng)的輸入?yún)?shù)作為過(guò)程調(diào)用的輸入,Slot函數(shù)的返回值作為過(guò)程調(diào)用的輸出結(jié)果。
[0010]進(jìn)一步的,所述遠(yuǎn)程過(guò)程調(diào)用中,當(dāng)客戶端任一進(jìn)程需要獲得其他機(jī)器節(jié)點(diǎn)的變化數(shù)據(jù)的時(shí)候,不同節(jié)點(diǎn)之間變化數(shù)據(jù)的通知包括如下步驟:首先在客戶端的數(shù)據(jù)服務(wù)模塊上對(duì)所述數(shù)據(jù)或該數(shù)據(jù)對(duì)象類型進(jìn)行注冊(cè);當(dāng)其它機(jī)器節(jié)點(diǎn)的數(shù)據(jù)變化后,將變化數(shù)據(jù)發(fā)送給客戶端的數(shù)據(jù)服務(wù)模塊;然后由客戶端的服務(wù)模塊通過(guò)進(jìn)程間過(guò)程調(diào)用通知所述注冊(cè)數(shù)據(jù)或數(shù)據(jù)對(duì)象類型所對(duì)應(yīng)的進(jìn)程,在所述對(duì)應(yīng)進(jìn)程的進(jìn)程空間內(nèi)執(zhí)行相應(yīng)的回調(diào)函數(shù)。
[0011]進(jìn)一步的,所述遠(yuǎn)程過(guò)程調(diào)用包括如下具體步驟:
[0012]f.機(jī)器節(jié)點(diǎn)按照功能分類,從QObject子類繼承得到若干個(gè)對(duì)象,節(jié)點(diǎn)之間的遠(yuǎn)程過(guò)程調(diào)用通過(guò)所述若干個(gè)對(duì)象所對(duì)應(yīng)的Slot函數(shù)實(shí)現(xiàn),并將所述QObject子類實(shí)例化為實(shí)例對(duì)象后加入到服務(wù)對(duì)象列表;
[0013]g.客戶端當(dāng)進(jìn)行遠(yuǎn)程過(guò)程調(diào)用時(shí),通過(guò)套接字將調(diào)用請(qǐng)求傳遞至對(duì)應(yīng)的機(jī)器節(jié)點(diǎn),所述客戶端在請(qǐng)求發(fā)送后進(jìn)入阻塞狀態(tài),等待所述對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)的返回結(jié)果;所述調(diào)用請(qǐng)求包括要執(zhí)行的對(duì)象類名、成員函數(shù)名及參數(shù);
[0014]h.所述對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)在收到所述調(diào)用請(qǐng)求后,首先根據(jù)對(duì)象類名在服務(wù)對(duì)象列表中找到對(duì)應(yīng)的實(shí)例對(duì)象,然后根據(jù)成員函數(shù)名通過(guò)Qt元對(duì)象系統(tǒng)找到對(duì)應(yīng)類的Slot函數(shù)的元對(duì)象方法,再通過(guò)解析所述元對(duì)象方法的參數(shù)類型,依次將傳入的參數(shù)轉(zhuǎn)換成對(duì)應(yīng)Slot函數(shù)所需的參數(shù)類型,然后通過(guò)元對(duì)象的invoke方法執(zhí)行所述Slot函數(shù),實(shí)現(xiàn)客戶端的請(qǐng)求;
[0015]1.所述對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)將對(duì)應(yīng)的執(zhí)行結(jié)果以及函數(shù)返回結(jié)果通過(guò)套接字發(fā)送至客戶端,至此所述對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)完成了一次遠(yuǎn)程過(guò)程調(diào)用服務(wù)請(qǐng)求;
[0016]j.客戶端在收到所述對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)的執(zhí)行結(jié)果以及函數(shù)返回結(jié)果后,首先根據(jù)所述執(zhí)行結(jié)果判斷執(zhí)行是否成功:如果執(zhí)行成功,則提取過(guò)程調(diào)用的函數(shù)返回結(jié)果并結(jié)束阻塞狀態(tài),至此客戶端發(fā)起的遠(yuǎn)程過(guò)程調(diào)用執(zhí)行結(jié)束;如果執(zhí)行失敗,則根據(jù)執(zhí)行結(jié)果錯(cuò)誤代碼進(jìn)行相應(yīng)的處理。
[0017]進(jìn)一步的,客戶端設(shè)置過(guò)程調(diào)用超時(shí)時(shí)間,如果在指定的時(shí)間內(nèi)所述對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)沒有響應(yīng)或沒有將執(zhí)行結(jié)果或函數(shù)返回結(jié)果傳遞至客戶端,過(guò)程調(diào)用自動(dòng)結(jié)束并返回超時(shí)的錯(cuò)誤代碼。
[0018]有益效果:本發(fā)明的多節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法,通過(guò)遠(yuǎn)程過(guò)程調(diào)用實(shí)現(xiàn)數(shù)據(jù)交互,遠(yuǎn)程過(guò)程調(diào)用的底層采用Qt元對(duì)象系統(tǒng)實(shí)現(xiàn)。遠(yuǎn)程過(guò)程調(diào)用中,從QObject子類定位遠(yuǎn)程過(guò)程調(diào)用指定的Slot槽函數(shù)并執(zhí)行,實(shí)現(xiàn)了靈活的過(guò)程調(diào)用處理。根據(jù)C++重載的特定,可以在QObject子類定義參數(shù)不同的同一個(gè)函數(shù),這樣調(diào)用者就可以根據(jù)自己的需要選擇適合的函數(shù),讓遠(yuǎn)程過(guò)程調(diào)用變得更加靈活。利用本發(fā)明方法實(shí)現(xiàn)的基于Qt元對(duì)象的遠(yuǎn)程過(guò)程調(diào)用機(jī)制,當(dāng)需要添加服務(wù)內(nèi)容時(shí),只需要在QObject子類中增加相應(yīng)的Slot槽函數(shù)或添加新的QObject子類實(shí)例,然后遠(yuǎn)程過(guò)程調(diào)用客戶端在調(diào)用時(shí)指定函數(shù)名稱和函數(shù)參數(shù)即可完成調(diào)用。因此,基于Qt元對(duì)象系統(tǒng)的遠(yuǎn)程過(guò)程調(diào)用服務(wù)模塊在擴(kuò)展、升級(jí)與維護(hù)等方面非常簡(jiǎn)單,同時(shí)讓系統(tǒng)模塊的開發(fā)更加靈活,而且可以在多個(gè)平臺(tái)上運(yùn)行。
【附圖說(shuō)明】
[0019]圖1是傳統(tǒng)方式下節(jié)點(diǎn)之間的數(shù)據(jù)業(yè)務(wù)處理結(jié)構(gòu)圖;
[0020]圖2是采用RPC實(shí)現(xiàn)節(jié)點(diǎn)之間的數(shù)據(jù)交互處理結(jié)構(gòu)圖;
[0021]圖3是本發(fā)明多節(jié)點(diǎn)數(shù)據(jù)交互多節(jié)點(diǎn)通訊示意圖;
[0022]圖4是多節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法流程圖;
[0023]圖5是客戶端在執(zhí)行遠(yuǎn)程過(guò)程調(diào)用時(shí)的調(diào)用形式。
【具體實(shí)施方式】
[0024]下面結(jié)合附圖對(duì)本發(fā)明做更進(jìn)一步的解釋。
[0025]如圖3所示,一種多節(jié)點(diǎn)數(shù)據(jù)交互的實(shí)現(xiàn)方法,在每個(gè)機(jī)器節(jié)點(diǎn)上布置數(shù)據(jù)服務(wù)模塊,任一節(jié)點(diǎn)上的數(shù)據(jù)服務(wù)模塊用于實(shí)現(xiàn)該節(jié)點(diǎn)自身進(jìn)程之間的數(shù)據(jù)交互,不同節(jié)點(diǎn)上的數(shù)據(jù)服務(wù)模塊實(shí)現(xiàn)不同節(jié)點(diǎn)進(jìn)程之間的數(shù)據(jù)交互。數(shù)據(jù)服務(wù)模塊基于遠(yuǎn)程過(guò)程調(diào)用協(xié)議實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)交互,遠(yuǎn)程過(guò)程調(diào)用協(xié)議的底層通過(guò)Qt元對(duì)象系統(tǒng)實(shí)現(xiàn)。節(jié)點(diǎn)之間的數(shù)據(jù)交互包括數(shù)據(jù)訪問(wèn)與操作、文件傳輸以及節(jié)點(diǎn)的數(shù)據(jù)備份;遠(yuǎn)程調(diào)用過(guò)程基于Qt元對(duì)象系統(tǒng)實(shí)現(xiàn)服務(wù)查找、參數(shù)輸入以及結(jié)果返回。進(jìn)程與本節(jié)點(diǎn)進(jìn)程或其他節(jié)點(diǎn)進(jìn)程之間進(jìn)行數(shù)據(jù)交互操作的時(shí)候均為同步過(guò)程調(diào)用;對(duì)于同一節(jié)點(diǎn)之間的數(shù)據(jù)交互,通訊方式采用管道;對(duì)于不同節(jié)點(diǎn)之間的數(shù)據(jù)交互,通訊方式根據(jù)IP地址采用套接字;通訊過(guò)程中數(shù)據(jù)傳輸采用加密的方式進(jìn)行傳輸,提高系統(tǒng)的可靠性與安全性。Qt元對(duì)象系統(tǒng)中QObject子類的函數(shù)所對(duì)應(yīng)的輸入?yún)?shù)作為過(guò)程調(diào)用的輸入,函數(shù)的返回值作為過(guò)程調(diào)用的輸出結(jié)果。
[0026]Qt是一個(gè)跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴(kuò)展以及一些宏,易于擴(kuò)展,允許組件編程;擴(kuò)展稱為元對(duì)象編譯器(Meta Object Compiler,moc)。Qt的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對(duì)于用戶開發(fā)來(lái)說(shuō)是非