異步通信模式下socket通信與進(jìn)程管理通用平臺(tái)及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及異步通信模式下SOCKET通信與進(jìn)程管理通用平臺(tái)及方法。
【背景技術(shù)】
[0002]在TCP/IP網(wǎng)絡(luò)層次模型中,SOCKET是應(yīng)用層與傳輸層之間的一個(gè)軟件抽象層,是諸多網(wǎng)絡(luò)通信編程技術(shù)的基礎(chǔ),應(yīng)用廣泛,具有低成本、低資源消耗、跨平臺(tái)等特點(diǎn)而備受青睞。
[0003]但是SOCKET編程有其技術(shù)門檻,編寫穩(wěn)健的SOCKET通信程序需要了解其技術(shù)特點(diǎn),規(guī)避特有的技術(shù)風(fēng)險(xiǎn),融合相關(guān)的進(jìn)程、內(nèi)存、信號(hào)、鎖等管理技術(shù),需要一定的技術(shù)功底。
[0004]為簡(jiǎn)化SOCKET編程,提高編程效率,業(yè)界提供了一些開源的C/C++網(wǎng)絡(luò)開發(fā)庫(kù),如ACE、Boost 的 AS10、libevent。
[0005]ACE是一個(gè)大型的中間件產(chǎn)品,過(guò)于龐大,SOCKET通信只是其龐大功能集合中的功能之一,學(xué)習(xí)門檻很高。
[0006]AS10是一個(gè)C++版本的異步10庫(kù),封裝了 SOCKET的常用操作,依賴Boost,要求開發(fā)人員熟悉C++、Boost,支持多線程并發(fā)處理,但是需要開發(fā)人員自行創(chuàng)建與管理線程并考慮線程安全。
[0007]libevent是對(duì)10多路復(fù)用技術(shù)的進(jìn)一步封裝,采用事件驅(qū)動(dòng)的運(yùn)行機(jī)制,本身不包含進(jìn)程或線程的管理,另外需要開發(fā)人員自行創(chuàng)建并管理SOCKET描述符。
[0008]上述三個(gè)開發(fā)庫(kù)都不適合簡(jiǎn)單通用的網(wǎng)絡(luò)程序開發(fā)場(chǎng)景:在單位內(nèi)部或外部,需要開發(fā)部署網(wǎng)絡(luò)通信程序進(jìn)行數(shù)據(jù)交換,采用自行約定的通信協(xié)議,而開發(fā)人員水平一般,不熟悉SOCKET通信機(jī)制、進(jìn)程管理、信號(hào)、鎖等編程技術(shù),此時(shí)快速開發(fā)部署穩(wěn)健的通信程序比較困難。
[0009]在請(qǐng)求密集場(chǎng)景中,通常采用異步通信模式,允許客戶端批量發(fā)送一批請(qǐng)求,在上一個(gè)請(qǐng)求處理完成之前,客戶端可以發(fā)送新的請(qǐng)求,從而提升交易請(qǐng)求吞吐量,服務(wù)端的應(yīng)答返回時(shí)客戶端根據(jù)應(yīng)答結(jié)果中的消息標(biāo)識(shí)關(guān)聯(lián)自己的請(qǐng)求消息,辨識(shí)應(yīng)答結(jié)果的歸屬。業(yè)界缺乏類似的開發(fā)庫(kù)。
【發(fā)明內(nèi)容】
[0010]為解決現(xiàn)有技術(shù)存在的不足,本發(fā)明公開了異步通信模式下SOCKET通信與進(jìn)程管理通用平臺(tái)及方法,融合SOCKET通信與進(jìn)程管理功能,開發(fā)人員用以快速開發(fā)部署網(wǎng)絡(luò)通信程序,無(wú)需關(guān)心SOCKET通信與進(jìn)程管理等技術(shù)細(xì)節(jié),專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),提高開發(fā)效率并降低開發(fā)門檻;對(duì)于網(wǎng)絡(luò)服務(wù)程序,可以通過(guò)配置參數(shù)指定服務(wù)進(jìn)程的數(shù)目,實(shí)現(xiàn)處理能力的靈活擴(kuò)展;采用多個(gè)進(jìn)程而不是線程并發(fā)運(yùn)行,開發(fā)人員無(wú)需考慮線程安全,進(jìn)一步降低開發(fā)門檻;平臺(tái)運(yùn)行內(nèi)置診斷模塊,實(shí)時(shí)監(jiān)控整個(gè)平臺(tái)的繁忙比率,達(dá)到設(shè)定閾值時(shí)在線增減服務(wù)進(jìn)程的數(shù)目,實(shí)現(xiàn)處理能力的動(dòng)態(tài)擴(kuò)展;實(shí)時(shí)監(jiān)控平臺(tái)的運(yùn)行狀況,對(duì)于異常終止或僵死的服務(wù)進(jìn)程自動(dòng)予以重啟,確保整個(gè)平臺(tái)穩(wěn)定持續(xù)運(yùn)行;另外包含一個(gè)直觀簡(jiǎn)易的運(yùn)行監(jiān)視界面,可以實(shí)時(shí)查看平臺(tái)全局信息與服務(wù)進(jìn)程的處理狀態(tài)。
[0011]支持異步通信模式,允許客戶端批量發(fā)送一批請(qǐng)求,在上一個(gè)請(qǐng)求處理完成之前,客戶端可以發(fā)送新的請(qǐng)求,從而提升交易請(qǐng)求吞吐量,服務(wù)端的應(yīng)答返回時(shí)客戶端根據(jù)應(yīng)答結(jié)果中的消息標(biāo)識(shí)關(guān)聯(lián)自己的請(qǐng)求消息,辨識(shí)應(yīng)答結(jié)果的歸屬。
[0012]為實(shí)現(xiàn)上述目的,本發(fā)明的具體方案如下:
[0013]SOCKET通信與進(jìn)程管理通用平臺(tái)發(fā)布為一個(gè)靜態(tài)庫(kù)文件,附帶一組頭文件、配套資料及代碼樣例,提供編程接口供開發(fā)人員編程調(diào)用,支持各種類UNIX操作系統(tǒng),支持C/C++開發(fā)語(yǔ)言。
[0014]與客戶端的通信協(xié)議支持TCP、UDP,采用異步通信模式。
[0015]TCP (Transmiss1n Control Protocol,傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議;UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議),是一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。
[0016]異步通信模式時(shí),允許客戶端批量發(fā)送一批請(qǐng)求,在上一個(gè)請(qǐng)求處理完成之前,客戶端可以發(fā)送新的請(qǐng)求,從而提升交易請(qǐng)求吞吐量,服務(wù)端的應(yīng)答返回時(shí)客戶端根據(jù)應(yīng)答結(jié)果中的消息標(biāo)識(shí)關(guān)聯(lián)自己的請(qǐng)求消息,辨識(shí)應(yīng)答結(jié)果的歸屬;
[0017]異步通信模式下SOCKET通信與進(jìn)程管理通用方法,包括以下步驟:
[0018]異步通信模式場(chǎng)景中,完整功能的實(shí)現(xiàn)包含兩個(gè)平臺(tái):一個(gè)異步通信平臺(tái)、一個(gè)業(yè)務(wù)處理平臺(tái),兩者通過(guò)消息隊(duì)列與UNIX域SOCKET通信機(jī)制交換數(shù)據(jù),靈活擴(kuò)展處理能力,提升交易吞吐量;
[0019]平臺(tái)運(yùn)行前需要編碼實(shí)現(xiàn)業(yè)務(wù)邏輯,編譯生成最終的執(zhí)行程序并部署。兩個(gè)平臺(tái)需要分別編寫編譯,分別部署,協(xié)作完成客戶端請(qǐng)求處理;
[0020]通信平臺(tái)運(yùn)行時(shí)創(chuàng)建一個(gè)平臺(tái)進(jìn)程、一個(gè)診斷進(jìn)程、一組通信進(jìn)程,通信進(jìn)程的數(shù)目由配置參數(shù)決定,平臺(tái)進(jìn)程根據(jù)配置文件中的平臺(tái)關(guān)鍵字創(chuàng)建進(jìn)程管理共享內(nèi)存、信號(hào)燈,創(chuàng)建一個(gè)SOCKET監(jiān)聽描述符、一個(gè)SOCKET管理描述符、一組描述符傳遞通道、一個(gè)空閑通道,對(duì)于UDP通信協(xié)議額外創(chuàng)建一個(gè)令牌通道;
[0021]業(yè)務(wù)處理平臺(tái)運(yùn)行時(shí)創(chuàng)建一個(gè)平臺(tái)進(jìn)程、一個(gè)診斷進(jìn)程、一個(gè)分發(fā)進(jìn)程、一組處理進(jìn)程,平臺(tái)進(jìn)程根據(jù)配置文件中的平臺(tái)關(guān)鍵字創(chuàng)建進(jìn)程管理共享內(nèi)存、信號(hào)燈,創(chuàng)建一個(gè)SOCKET管理描述符;
[0022]異步通信平臺(tái)與業(yè)務(wù)處理平臺(tái)運(yùn)行就緒之后,等待客戶端連接請(qǐng)求;
[0023]客戶端發(fā)起連接請(qǐng)求時(shí),由通信平臺(tái)中的平臺(tái)進(jìn)程接受連接請(qǐng)求,得到客戶端連接描述符,通過(guò)事先創(chuàng)建的描述符傳遞通道傳遞給某個(gè)空閑的通信進(jìn)程,平臺(tái)進(jìn)程關(guān)閉與客戶端的連接;
[0024]通信進(jìn)程接管與客戶端的連接,讀取客戶端請(qǐng)求消息,綁定自己的進(jìn)程序號(hào)后,放入請(qǐng)求隊(duì)列;
[0025]處理平臺(tái)中的分發(fā)進(jìn)程從請(qǐng)求隊(duì)列中讀取請(qǐng)求,分發(fā)給某個(gè)空閑的處理進(jìn)程,處理進(jìn)程處理完成之后,連接請(qǐng)求消息中的進(jìn)程序號(hào)對(duì)應(yīng)的通信進(jìn)程,并發(fā)送應(yīng)答結(jié)果;
[0026]通信平臺(tái)中的通信進(jìn)程轉(zhuǎn)發(fā)應(yīng)答結(jié)果給客戶端,從而應(yīng)答結(jié)果由接收該請(qǐng)求消息的通信進(jìn)程返回。
[0027]進(jìn)一步的,兩個(gè)平臺(tái)各自的進(jìn)程管理共享內(nèi)存中包含平臺(tái)全局信息,如:平臺(tái)類型、服務(wù)進(jìn)程數(shù)目、服務(wù)進(jìn)程繁忙比率、平臺(tái)進(jìn)程ID、診斷進(jìn)程ID等,以及一組管理槽位,每個(gè)服務(wù)進(jìn)程占用其中一個(gè)槽位,存放服務(wù)進(jìn)程的私有信息,包括:進(jìn)程ID、運(yùn)行狀態(tài)、用戶ID、組ID、執(zhí)行時(shí)間、執(zhí)行時(shí)限等。
[0028]進(jìn)一步的,一個(gè)通信進(jìn)程可以搭配一組處理進(jìn)程,通信進(jìn)程專職通信,處理進(jìn)程專職業(yè)務(wù)邏輯處理,兩者通過(guò)消息隊(duì)列與UNIX域SOCKET通信機(jī)制交換數(shù)據(jù)。
[0029]進(jìn)一步的,通信平臺(tái)以SOCKET服務(wù)模式運(yùn)行,處理平臺(tái)以常駐進(jìn)程管理模式運(yùn)行。SOCKET服務(wù)模式作為SOCKET服務(wù)與客戶端通信,通過(guò)配置參數(shù)指定服務(wù)進(jìn)程的數(shù)目,實(shí)現(xiàn)處理能力的靈活擴(kuò)展,具有自我診斷與實(shí)時(shí)運(yùn)行監(jiān)視功能;常駐進(jìn)程管理模式中,業(yè)務(wù)邏輯封裝為獨(dú)立的插件程序在平臺(tái)上運(yùn)行,每個(gè)插件程序可以彼此不同,可以由不同的用戶執(zhí)行,可以單獨(dú)啟動(dòng)或停止,在單個(gè)平臺(tái)中集中管理多個(gè)用戶的后臺(tái)散亂任務(wù),同樣具有自我診斷與實(shí)時(shí)運(yùn)行監(jiān)視功能。
[0030]進(jìn)一步的,在通信平臺(tái)中,客戶端請(qǐng)求到達(dá)之后由平臺(tái)進(jìn)程接受,得到客戶端連接描述符,通過(guò)描述符傳遞通道發(fā)送給空閑的通信進(jìn)程,通信進(jìn)程創(chuàng)建一個(gè)UNIX域的監(jiān)聽SOCKET,作為與處理平臺(tái)中的處理進(jìn)程交互的通道,之后通信進(jìn)程通過(guò)10多路復(fù)用技術(shù)同時(shí)兼顧客戶端描述符、UNIX域監(jiān)聽SOCKET。
[0031]進(jìn)一步的,在處理平臺(tái)中,處理進(jìn)程讀取客戶端請(qǐng)求消息,處理業(yè)務(wù)邏輯,根據(jù)消息綁定的通信進(jìn)程序號(hào)連接對(duì)應(yīng)的通信進(jìn)程的UNIX域監(jiān)聽SOCKET并發(fā)送應(yīng)答結(jié)果,通信進(jìn)程接受處理進(jìn)程連接請(qǐng)求,得到處理進(jìn)程連接描述符,之后通信進(jìn)程的10多路復(fù)用操作將兼顧這個(gè)新的處理進(jìn)程連接描述符,從中讀取處理進(jìn)程應(yīng)答結(jié)果并轉(zhuǎn)發(fā)給客戶端。
[0032]進(jìn)一步的,在處理平臺(tái)內(nèi)部,采用分發(fā)邏輯,平臺(tái)啟動(dòng)時(shí)創(chuàng)建一個(gè)空閑通道與一組數(shù)據(jù)傳輸通道,再采用插件程序的方式運(yùn)行一個(gè)分發(fā)進(jìn)程與一組處理進(jìn)程,處理進(jìn)程啟動(dòng)時(shí)在空閑通道中登記自己的進(jìn)程編號(hào),并等待讀取自己專屬的數(shù)據(jù)傳輸通道,分發(fā)進(jìn)程從請(qǐng)求隊(duì)列中提取客戶端請(qǐng)求,從空閑通道中提取第一個(gè)空閑的處理進(jìn)程編號(hào),通過(guò)進(jìn)程編號(hào)對(duì)應(yīng)的數(shù)據(jù)通道發(fā)送客戶端的請(qǐng)求數(shù)據(jù),對(duì)應(yīng)的處理進(jìn)程接收并處理請(qǐng)求的業(yè)務(wù)邏輯,之后向請(qǐng)求數(shù)據(jù)對(duì)應(yīng)的通信進(jìn)程發(fā)送應(yīng)