本發(fā)明涉及電力系統(tǒng)通信技術(shù)領(lǐng)域,特別是涉及一種分布式代理的鏈路復(fù)用的方法。
背景技術(shù):
近期特高壓建設(shè)的快速推進(jìn),區(qū)域間電網(wǎng)聯(lián)系更加密切,一體化調(diào)度的特征日趨明顯。智能電網(wǎng)調(diào)度控制系統(tǒng)中需要跨機(jī)構(gòu)進(jìn)行數(shù)據(jù)交互的進(jìn)程越來(lái)越多,所以不同調(diào)度機(jī)構(gòu)代理間存在大量TCP連接。
遠(yuǎn)程服務(wù)代理是智能電網(wǎng)調(diào)度控制系統(tǒng)中的一個(gè)通訊基礎(chǔ)模塊,可以實(shí)現(xiàn)不同調(diào)度機(jī)構(gòu)或者不同區(qū)之間的數(shù)據(jù)交互,為構(gòu)建廣域全景的智能電網(wǎng)調(diào)度系統(tǒng)提供進(jìn)程間通信的基礎(chǔ)設(shè)施。目前遠(yuǎn)程服務(wù)代理已經(jīng)在國(guó)、分、省三級(jí)調(diào)控機(jī)構(gòu)實(shí)現(xiàn)了部署,支撐了大量的調(diào)度業(yè)務(wù),包括遠(yuǎn)程畫(huà)面瀏覽、遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn)、告警信息遠(yuǎn)程推送等?,F(xiàn)有技術(shù)中,代理采用獨(dú)占鏈路模式,調(diào)度機(jī)構(gòu)A的客戶(hù)端訪問(wèn)調(diào)度機(jī)構(gòu)B服務(wù)的過(guò)程為,客戶(hù)端先與本地代理建立TCP連接,本地代理與遠(yuǎn)程代理建立TCP連接,遠(yuǎn)程代理通過(guò)調(diào)度B的服務(wù)總線連接服務(wù)程序。服務(wù)程序的響應(yīng)報(bào)文通過(guò)遠(yuǎn)程代理轉(zhuǎn)發(fā)給本地代理,再由本地代理回發(fā)給客戶(hù)端。每有一個(gè)的客戶(hù)端訪問(wèn)服務(wù),就要建立1條TCP連接。
在當(dāng)前獨(dú)占鏈路模式下,TCP連接占用了系統(tǒng)大量的連接句柄、CPU、內(nèi)存、網(wǎng)絡(luò)等資源,嚴(yán)重影響代理程序的穩(wěn)定運(yùn)行。
因此,目前急需一種共享鏈路的方法,兩個(gè)不同調(diào)度機(jī)構(gòu)間理論上只存在兩條TCP連接,使分布式代理更加穩(wěn)定、高效地運(yùn)行。
技術(shù)實(shí)現(xiàn)要素:
為解決上述技術(shù)問(wèn)題,在共享鏈路的模式下,兩個(gè)不同調(diào)度機(jī)構(gòu)間理論上只存在兩條TCP連接,以支持代理間的雙向通信。跨區(qū)域的客戶(hù)端和服務(wù)程序以邏輯會(huì)話的形式進(jìn)行數(shù)據(jù)交互,不同的會(huì)話復(fù)用一條物理TCP鏈路。共享鏈路模式可以極大程度降低不同區(qū)域間代理的連接數(shù),從而降低代理程序的負(fù)荷。
為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明提供一種加強(qiáng)分布式代理運(yùn)行穩(wěn)定性和高效性的鏈路復(fù)用方法。
本發(fā)明解決其技術(shù)問(wèn)題是采取以下技術(shù)方案實(shí)現(xiàn)的:
一種分布式代理的鏈路復(fù)用的方法,不同區(qū)域調(diào)度機(jī)構(gòu)使用動(dòng)態(tài)代理服務(wù)形成分布式代理,本地客戶(hù)端訪問(wèn)異地調(diào)度機(jī)構(gòu)的應(yīng)用時(shí),本地代理服務(wù)作為輸出代理,異地代理服務(wù)作為輸入代理,分布式代理在兩個(gè)代理服務(wù)之間建立兩條TCP鏈路,分別為正向鏈路和反向鏈路,并創(chuàng)建一個(gè)會(huì)話,會(huì)話的請(qǐng)求報(bào)文通過(guò)正向鏈路傳輸至異地調(diào)度機(jī)構(gòu)的動(dòng)態(tài)代理服務(wù),會(huì)話的響應(yīng)報(bào)文通過(guò)反向鏈路傳輸至本地調(diào)度機(jī)構(gòu)的動(dòng)態(tài)代理服務(wù);
當(dāng)所述異地調(diào)度機(jī)構(gòu)的客戶(hù)端訪問(wèn)本地的應(yīng)用時(shí),分布式代理創(chuàng)建另一個(gè)會(huì)話,會(huì)話的請(qǐng)求報(bào)文通過(guò)所述反向鏈路傳輸至本地調(diào)度機(jī)構(gòu)的動(dòng)態(tài)代理服務(wù),會(huì)話的響應(yīng)報(bào)文通過(guò)所述正向鏈路傳輸至異地調(diào)度機(jī)構(gòu)的動(dòng)態(tài)代理服務(wù);
所述TCP鏈路為長(zhǎng)連接,建立后不會(huì)主動(dòng)關(guān)閉。
進(jìn)一步地,所述輸出代理包括客戶(hù)端處理模塊、會(huì)話數(shù)據(jù)緩存模塊和數(shù)據(jù)轉(zhuǎn)發(fā)模塊,其中,客戶(hù)端處理模塊監(jiān)聽(tīng)客戶(hù)端請(qǐng)求,如果有客戶(hù)端請(qǐng)求則創(chuàng)建線程處理該請(qǐng)求,將客戶(hù)端請(qǐng)求按照代理會(huì)話協(xié)議ASP重新封裝報(bào)文,更新到輸入緩存,等待輸出緩存的信號(hào);
會(huì)話數(shù)據(jù)緩存模塊存儲(chǔ)本地動(dòng)態(tài)代理服務(wù)同異地調(diào)度機(jī)構(gòu)間的會(huì)話數(shù)據(jù),所述會(huì)話數(shù)據(jù)包括客戶(hù)端的請(qǐng)求報(bào)文會(huì)話數(shù)據(jù)、服務(wù)端的響應(yīng)報(bào)文和控制報(bào)文的會(huì)話數(shù)據(jù);
數(shù)據(jù)轉(zhuǎn)發(fā)模塊包括若干收發(fā)數(shù)據(jù)的工作線程和鏈路管理線程,工作線程收發(fā)一個(gè)地區(qū)內(nèi)的會(huì)話數(shù)據(jù),鏈路管理線程對(duì)工作線程進(jìn)行管理。
進(jìn)一步地,所述輸入代理包括數(shù)據(jù)轉(zhuǎn)發(fā)模塊、會(huì)話緩存模塊和服務(wù)端處理模塊,所述數(shù)據(jù)轉(zhuǎn)發(fā)模塊接收客戶(hù)端的請(qǐng)求數(shù)據(jù),轉(zhuǎn)發(fā)至服務(wù)端處理模塊,所述服務(wù)端處理模塊通過(guò)服務(wù)線程與應(yīng)用程序建立連接,服務(wù)線程將請(qǐng)求轉(zhuǎn)發(fā)給應(yīng)用程序,并將應(yīng)用程序的響應(yīng)報(bào)文更新至?xí)捑彺娴捻憫?yīng)緩存區(qū)。
進(jìn)一步地,所述代理會(huì)話協(xié)議ASP保證代理兩端準(zhǔn)確識(shí)別每一個(gè)數(shù)據(jù)報(bào)文的來(lái)源、類(lèi)型及目的,并傳輸控制命令及錯(cuò)誤信息,所述報(bào)文格式由依次順序的設(shè)定特定字節(jié)長(zhǎng)度的會(huì)話編號(hào)、區(qū)域號(hào)、服務(wù)號(hào)、報(bào)文類(lèi)型、優(yōu)先級(jí)、控制位、錯(cuò)誤號(hào)和報(bào)文長(zhǎng)度組成。
進(jìn)一步地,所述客戶(hù)端處理模塊包括客戶(hù)端監(jiān)聽(tīng)器和線程池,所述線程池有若干個(gè)客戶(hù)端工作線程cworker,客戶(hù)端監(jiān)聽(tīng)器負(fù)責(zé)實(shí)時(shí)監(jiān)聽(tīng)客戶(hù)端請(qǐng)求,當(dāng)有新的客戶(hù)端請(qǐng)求時(shí),所述監(jiān)聽(tīng)器從線程池中分配一個(gè)cworker線程響應(yīng)所述新的客戶(hù)端,cworker線程與客戶(hù)端建立連接后,接受客戶(hù)端報(bào)文,并按照代理會(huì)話協(xié)議ASP封裝客戶(hù)端報(bào)文,放到相應(yīng)區(qū)域的會(huì)話緩存區(qū)中。
進(jìn)一步地,所述服務(wù)端處理模塊包括若干個(gè)服務(wù)端工作線程sworker,服務(wù)端工作線程收到數(shù)據(jù)傳輸模塊轉(zhuǎn)發(fā)的請(qǐng)求報(bào)文后,通過(guò)解析代理會(huì)話協(xié)議ASP頭部選擇獲取應(yīng)用程序,并將請(qǐng)求報(bào)文發(fā)送給響應(yīng)的應(yīng)用程序,然后獲取應(yīng)用程序響應(yīng)報(bào)文后將響應(yīng)報(bào)文封裝成代理會(huì)話協(xié)議ASP報(bào)文暫存到響應(yīng)緩存區(qū)中。
進(jìn)一步地,所述數(shù)據(jù)轉(zhuǎn)發(fā)模塊由若干組數(shù)據(jù)傳輸線程組成,將響應(yīng)的代理會(huì)話協(xié)議ASP報(bào)文發(fā)送到指定區(qū)域。
進(jìn)一步地,異常處理的機(jī)制,客戶(hù)端和遠(yuǎn)程服務(wù)器通過(guò)協(xié)議報(bào)文共享異常信息,檢測(cè)到異常情況后將錯(cuò)誤編號(hào)更新到代理會(huì)話協(xié)議ASP的頭部,并通知異常相應(yīng)的模塊。
本發(fā)明的優(yōu)點(diǎn)和積極效果是:
1、本發(fā)明在共享鏈路的模式下,兩個(gè)不同調(diào)度機(jī)構(gòu)間理論上只存在兩條TCP連接,以支持代理間的雙向通信,提高了不同地域、不同級(jí)別調(diào)度機(jī)構(gòu)信息交互的效率,提高了電力系統(tǒng)運(yùn)行的安全性。
2、本發(fā)明通過(guò)鏈路復(fù)用方法改進(jìn)后,分布式代理更加穩(wěn)定、運(yùn)行效率更高,可以支持更高的并發(fā)度,同時(shí)大大減少了程序運(yùn)行時(shí)系統(tǒng)資源的占用率。
附圖說(shuō)明
圖1為本發(fā)明分布式代理鏈路復(fù)用的原理示意圖;
圖2為本發(fā)明分布式代理鏈路復(fù)用信息傳輸?shù)慕Y(jié)構(gòu)示意圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,下面結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的結(jié)構(gòu)圖及具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
以下結(jié)合附圖對(duì)本發(fā)明實(shí)施例作進(jìn)一步詳述:
本發(fā)明提供了一種分布式代理的鏈路復(fù)用的方法,圖1為本發(fā)明分布式代理鏈路復(fù)用的原理示意圖,如圖1所示,鏈路復(fù)用的總體思路是用邏輯會(huì)話替代物理鏈路,客戶(hù)端與遠(yuǎn)程服務(wù)間通過(guò)會(huì)話進(jìn)行通信,兩個(gè)調(diào)度機(jī)構(gòu)間的每個(gè)傳輸方向的所有會(huì)話復(fù)用一條物理鏈路。調(diào)度A的客戶(hù)端C1訪問(wèn)調(diào)度B的S1應(yīng)用時(shí),代理會(huì)為C1、B1之間的通訊創(chuàng)建一個(gè)會(huì)話1(session1),同時(shí)建立AB、BA兩條TCP鏈路,然后session1的請(qǐng)求報(bào)文通過(guò)AB鏈路傳輸,session1的響應(yīng)報(bào)文通過(guò)BA鏈路傳輸。此時(shí)如果客戶(hù)端C2要訪問(wèn)調(diào)度機(jī)構(gòu)B的S2應(yīng)用,代理會(huì)再創(chuàng)建會(huì)話session2,session2的請(qǐng)求報(bào)文同session1的請(qǐng)求報(bào)文復(fù)用AB鏈路,session1和session2的響應(yīng)報(bào)文復(fù)用BA鏈路。代理之間TCP鏈路為長(zhǎng)連接,建立后不會(huì)主動(dòng)關(guān)閉。
圖2為本發(fā)明分布式代理鏈路復(fù)用信息傳輸?shù)慕Y(jié)構(gòu)示意圖,信息的傳輸如圖2所示,代理主要通過(guò)引入會(huì)話機(jī)制實(shí)現(xiàn)鏈路復(fù)用功能支撐鏈路共享模式的輸出代理主要由客戶(hù)端處理模塊、會(huì)話數(shù)據(jù)緩存模塊、數(shù)據(jù)轉(zhuǎn)發(fā)模塊三部分組成。客戶(hù)端處理模塊負(fù)責(zé)監(jiān)聽(tīng)客戶(hù)端請(qǐng)求,如果有客戶(hù)端請(qǐng)求則創(chuàng)建線程處理該請(qǐng)求。具體為將客戶(hù)端請(qǐng)求按照代理會(huì)話協(xié)議(Agent session protocol,ASP)重新封裝報(bào)文并將其更新到輸入緩存,同時(shí)等待輸出緩存的信號(hào)量。會(huì)話數(shù)據(jù)緩存主要用于存儲(chǔ)本地代理同各調(diào)度機(jī)構(gòu)間的會(huì)話數(shù)據(jù),包括客戶(hù)端的請(qǐng)求報(bào)文、服務(wù)端的響應(yīng)報(bào)文和控制報(bào)文,分別儲(chǔ)在請(qǐng)求緩存和響應(yīng)緩存。數(shù)據(jù)轉(zhuǎn)發(fā)模塊包括N個(gè)負(fù)責(zé)收發(fā)數(shù)據(jù)的工作線程及鏈路管理線程。每個(gè)工作線程負(fù)責(zé)收發(fā)一個(gè)區(qū)域的會(huì)話數(shù)據(jù)。鏈路管理線程負(fù)責(zé)對(duì)worker線程進(jìn)行管理。
輸入代理包括數(shù)據(jù)轉(zhuǎn)發(fā)模塊、會(huì)話緩存模塊及服務(wù)端處理模塊。數(shù)據(jù)轉(zhuǎn)發(fā)模塊通過(guò)對(duì)端轉(zhuǎn)發(fā)模塊接受客戶(hù)端的請(qǐng)求數(shù)據(jù),并將其轉(zhuǎn)發(fā)給服務(wù)端處理模塊。服務(wù)端處理模塊的服務(wù)線程直接與服務(wù)程序建立連接,服務(wù)線程將請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)程序并將服務(wù)的響應(yīng)報(bào)文更新到會(huì)話緩存的響應(yīng)緩存區(qū)。
ASP協(xié)議原理
設(shè)計(jì)代理會(huì)話協(xié)議(Agent session protocol,ASP)是保證客戶(hù)端和服務(wù)器跨區(qū)遠(yuǎn)程通信的基礎(chǔ),協(xié)議頭部記錄了會(huì)話編號(hào)、區(qū)域號(hào)、服務(wù)號(hào)等信息。ASP協(xié)議保證了代理兩端可以準(zhǔn)確識(shí)別每一個(gè)數(shù)據(jù)報(bào)文的來(lái)源、類(lèi)型及目的,同時(shí)可以通過(guò)該協(xié)議傳輸控制命令及錯(cuò)誤信息,保證兩端程序可以通過(guò)會(huì)話的形式進(jìn)行高效、安全的通信。
代理會(huì)話協(xié)議ASP保證代理兩端準(zhǔn)確識(shí)別每一個(gè)數(shù)據(jù)報(bào)文的來(lái)源、類(lèi)型及目的,并傳輸控制命令及錯(cuò)誤信息,所述報(bào)文格式由依次順序的設(shè)定特定字節(jié)長(zhǎng)度的會(huì)話編號(hào)、區(qū)域號(hào)、服務(wù)號(hào)、報(bào)文類(lèi)型、優(yōu)先級(jí)、控制位、錯(cuò)誤號(hào)和報(bào)文長(zhǎng)度組成。例如,報(bào)文頭部前四個(gè)字節(jié)用于存儲(chǔ)會(huì)話編號(hào)。之后2個(gè)字節(jié)是區(qū)域號(hào),區(qū)域號(hào)用于表示該會(huì)話要發(fā)往那個(gè)區(qū)域。服務(wù)號(hào)占兩個(gè)字節(jié),用于表示該會(huì)話報(bào)文是請(qǐng)求哪個(gè)服務(wù)程序的。報(bào)文類(lèi)型占1個(gè)字節(jié)表示該會(huì)話報(bào)文的類(lèi)型,主要有請(qǐng)求報(bào)文、響應(yīng)報(bào)文、錯(cuò)誤報(bào)文、控制報(bào)文四種類(lèi)型。優(yōu)先級(jí)字段用于表示該會(huì)話傳輸?shù)膬?yōu)先級(jí),保證高優(yōu)先級(jí)的會(huì)話響應(yīng)性高于優(yōu)先級(jí)低的會(huì)話??刂莆恢饕鎯?chǔ)會(huì)話之間的控制信息。錯(cuò)誤號(hào)占2個(gè)字節(jié),用于表示數(shù)據(jù)傳輸過(guò)程中的異常信息,如斷網(wǎng)錯(cuò)誤、連接失敗、服務(wù)不可用等。
數(shù)據(jù)處理模塊包括客戶(hù)端數(shù)據(jù)處理模塊和服務(wù)端處理模塊,客戶(hù)端處理模塊包括一個(gè)客戶(hù)端監(jiān)聽(tīng)器和線程池,線程池中有若干個(gè)客戶(hù)端工作線程cworker??蛻?hù)端監(jiān)聽(tīng)器負(fù)責(zé)實(shí)時(shí)監(jiān)聽(tīng)客戶(hù)端請(qǐng)求。如果有新的客戶(hù)端請(qǐng)求,監(jiān)聽(tīng)器會(huì)從線程池中分配一個(gè)cworker線程響應(yīng)該客戶(hù)端。cworker線程與客戶(hù)端建立連接后,接受客戶(hù)端報(bào)文,并按照ASP協(xié)議封裝客戶(hù)端報(bào)文并將其放到客戶(hù)相應(yīng)區(qū)域的會(huì)話緩存區(qū)中。同時(shí)在該區(qū)域會(huì)話緩存的輸出緩存中等待信號(hào)量。一旦輸出緩存可讀,工作線程將從輸出緩存中讀取服務(wù)端的會(huì)話響應(yīng)報(bào)文,并將其返回給客戶(hù)端。
服務(wù)端處理模塊包括若干個(gè)服務(wù)端工作線程sworker。Sworker線程收到數(shù)據(jù)傳輸模塊轉(zhuǎn)發(fā)的請(qǐng)求報(bào)文后,會(huì)通過(guò)解析ASP協(xié)議頭部獲取請(qǐng)求哪個(gè)服務(wù)程序,并將請(qǐng)求報(bào)文發(fā)送給響應(yīng)的服務(wù)程序。然后獲取服務(wù)程序響應(yīng)報(bào)文后將響應(yīng)報(bào)文封裝成ASP協(xié)議報(bào)文暫存到響應(yīng)緩存區(qū)中。
數(shù)據(jù)轉(zhuǎn)發(fā)模塊主要負(fù)責(zé)轉(zhuǎn)發(fā)相應(yīng)的ASP協(xié)議報(bào)文到指定區(qū)域,由若干組數(shù)據(jù)傳輸線程組成,每組有兩個(gè)線程sworker和rworker,其中sworker負(fù)責(zé)發(fā)送數(shù)據(jù),rworker服務(wù)負(fù)責(zé)接收數(shù)據(jù)。輸出代理轉(zhuǎn)發(fā)模塊的sworker線程負(fù)責(zé)到相應(yīng)區(qū)域緩存區(qū)的請(qǐng)求緩存區(qū)中獲取會(huì)話的請(qǐng)求報(bào)文發(fā)送給相應(yīng)區(qū)域的數(shù)據(jù)轉(zhuǎn)發(fā)模塊。輸出代理轉(zhuǎn)發(fā)模塊的rworker線程負(fù)責(zé)接收相應(yīng)區(qū)域代理的數(shù)據(jù)緩存到響應(yīng)緩存區(qū)中,并通過(guò)信號(hào)量通知客戶(hù)端處理模塊的相關(guān)線程取數(shù)據(jù)。輸出代理轉(zhuǎn)發(fā)模塊的rworker線程負(fù)責(zé)接收請(qǐng)求報(bào)文并轉(zhuǎn)發(fā)給服務(wù)端處理模塊。sworker線程獲取響應(yīng)緩存區(qū)信號(hào)量后會(huì)讀取響應(yīng)緩存區(qū)的響應(yīng)報(bào)文,并發(fā)送給響應(yīng)區(qū)域的代理程序。
異常處理機(jī)制
客戶(hù)端和遠(yuǎn)程服務(wù)器進(jìn)行數(shù)據(jù)交換時(shí)報(bào)文經(jīng)過(guò)的環(huán)節(jié)非常多,為了使模塊之間不會(huì)相互影響,代理采用松耦合的設(shè)計(jì)理念,每個(gè)環(huán)節(jié)都采用異步方式。這種設(shè)計(jì)導(dǎo)致各模塊無(wú)法直接通信,異常感知能力較差。因此代理專(zhuān)門(mén)設(shè)計(jì)了協(xié)議異常處理機(jī)制,通過(guò)協(xié)議報(bào)文共享異常信息。
代理常見(jiàn)的異常情況有客戶(hù)端斷開(kāi)錯(cuò)誤、網(wǎng)絡(luò)超時(shí)錯(cuò)誤、更新緩存區(qū)失敗錯(cuò)誤等,詳見(jiàn)表一。代理各模塊檢測(cè)到相應(yīng)異常情況后會(huì)將錯(cuò)誤編號(hào)更新到ASP協(xié)議的頭部,并通知相應(yīng)的模塊。例如在客戶(hù)端發(fā)出報(bào)文請(qǐng)求后,如何輸入代理檢查到遠(yuǎn)程服務(wù)程序不存在或者無(wú)法定位。數(shù)據(jù)代理的相關(guān)線程會(huì)更新ASP報(bào)文頭的錯(cuò)誤號(hào)為1005,并將報(bào)文回發(fā)到請(qǐng)求端??蛻?hù)端處理模塊獲取該消息后會(huì)及時(shí)通知客戶(hù)端進(jìn)行相應(yīng)處理。
表一代理常見(jiàn)異常情況
需要強(qiáng)調(diào)的是,本發(fā)明所述的實(shí)施例是說(shuō)明性的,而不是限定性的,因此本發(fā)明包括并不限于具體實(shí)施方式中所述的實(shí)施例,凡是由本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出的其他實(shí)施方式,同樣屬于本發(fā)明保護(hù)的范圍。