專利名稱:一種分布式應(yīng)用中的分布式通訊方法
技術(shù)領(lǐng)域:
本發(fā)明屬于分布式應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種分布式應(yīng)用中的分布式通訊方法。
背景技術(shù):
在分布式應(yīng)用中,經(jīng)常會(huì)有多個(gè)子系統(tǒng)之間調(diào)用的需求,比如在承載大并發(fā)量的系統(tǒng)實(shí)現(xiàn)中,一般用戶請求會(huì)調(diào)用到負(fù)載均衡設(shè)備,負(fù)載均衡設(shè)備再將請求分發(fā)到web服務(wù)器集群,web服務(wù)器集群再將請求分發(fā)到緩存服務(wù)器集群,如果緩存服務(wù)器集群能夠命中緩存則返回結(jié)果給web服務(wù)器,否則web服務(wù)器繼續(xù)將請求分發(fā)給后端的應(yīng)用服務(wù)器集群。在這一系列的調(diào)用過程中,每個(gè)環(huán)節(jié)都需要進(jìn)行網(wǎng)絡(luò)通訊,并且對于通訊過程的性能、穩(wěn)定 性、容災(zāi)性等都有較高的要求。而現(xiàn)有的通訊框架往往更加關(guān)注于點(diǎn)對點(diǎn)的通訊性能,而缺少在集群應(yīng)用時(shí)需要考慮的集群整體可用性。從而導(dǎo)致在大規(guī)模分布式系統(tǒng)在使用此類通訊框架時(shí),穩(wěn)定性不夠高。比如容災(zāi)的策略、被調(diào)方的自動(dòng)監(jiān)控、恢復(fù)策略、報(bào)警策略等不夠完善。(比如Mina、Netty等都缺少對集群系統(tǒng)高可用性的功能)。此外,現(xiàn)有通訊框架為了提供更高的可定制性,以適應(yīng)在不同應(yīng)用場景下的需求,必須通過對調(diào)用方暴露大量API,由此,導(dǎo)致封裝性不夠好,使用者往往需要關(guān)心通訊協(xié)議、連接池、線程池等通訊細(xì)節(jié),所以配置復(fù)雜,學(xué)習(xí)成本較高(比如開源通訊框架JGroup)。
發(fā)明內(nèi)容
鑒于現(xiàn)有技術(shù)的缺陷,本發(fā)明提供一種分布式應(yīng)用中的分布式通訊方法,其特征在于包括如下步驟SI,由代理服務(wù)器將用戶請求分發(fā)到內(nèi)部的多個(gè)子系統(tǒng);S2,串行同步調(diào)用所述多個(gè)子系統(tǒng);S3,每個(gè)子系統(tǒng)設(shè)置多臺(tái)服務(wù)器,采用并行異步調(diào)用的方式調(diào)用每個(gè)子系統(tǒng)內(nèi)部的所述多臺(tái)服務(wù)器;S4,當(dāng)子系統(tǒng)的某個(gè)節(jié)點(diǎn)服務(wù)器宕機(jī)或壓力過大時(shí),代理服務(wù)器將用戶請求動(dòng)態(tài)分配到其它節(jié)點(diǎn)服務(wù)器。S5,子系統(tǒng)經(jīng)過各自獨(dú)立的運(yùn)算后將運(yùn)算結(jié)果返回給代理服務(wù)器,代理服務(wù)器再進(jìn)行匯總處理并返回給外部調(diào)用方。進(jìn)一步,本發(fā)明所述的分布式應(yīng)用中分布式通訊方法,其特征在于步驟S2中所述串行同步調(diào)用所述多個(gè)子系統(tǒng)的過程具體為只有調(diào)用一個(gè)子系統(tǒng)完成或超時(shí)后,才能調(diào)用另一子系統(tǒng),依次類推。進(jìn)一步,本發(fā)明所述的分布式應(yīng)用中分布式通訊方法,其特征在于步驟S3中采用并行異步調(diào)用的方式調(diào)用每個(gè)子系統(tǒng)內(nèi)部的多臺(tái)服務(wù)器過程具體為將用戶請求復(fù)制多份相同請求同時(shí)向子系統(tǒng)集群內(nèi)的多臺(tái)服務(wù)器發(fā)起,并且不會(huì)阻塞等待某一臺(tái)服務(wù)器返回結(jié)果,而是通過事件機(jī)制,當(dāng)調(diào)用方收到被調(diào)方返回結(jié)果的事件時(shí)觸發(fā)回調(diào),當(dāng)回調(diào)次數(shù)等于服務(wù)器個(gè)數(shù)或超時(shí)后,子系統(tǒng)集群調(diào)用結(jié)束。進(jìn)一步,本發(fā)明所述的分布式應(yīng)用中分布式通訊方法,其特征在于在所述子系統(tǒng)內(nèi)設(shè)置多組服務(wù)器,每組服務(wù)器的數(shù)量相同,并且一組服務(wù)器構(gòu)成一個(gè)完整數(shù)據(jù)集,多組服務(wù)器構(gòu)成多個(gè)完整數(shù)據(jù)集的冗余集合以分流并發(fā)請求。進(jìn)一步,本發(fā)明所述的分布式應(yīng)用中分布式通訊方法,其特征在于步驟S5中所述當(dāng)子系統(tǒng)的某個(gè)節(jié)點(diǎn)服務(wù)器宕機(jī)或壓力過大時(shí),代理服務(wù)器將用戶請求動(dòng)態(tài)分配到其它節(jié)點(diǎn)服務(wù)器具體為代理服務(wù)器通過與子系統(tǒng)內(nèi)的每臺(tái)服務(wù)器保持通訊穩(wěn)定性的校驗(yàn)來確定服務(wù)器的負(fù)載情況,當(dāng)某臺(tái)子系統(tǒng)服務(wù)器負(fù)載過高時(shí),代理服務(wù)器將子系統(tǒng)服務(wù)器暫時(shí)從系統(tǒng)內(nèi)摘除,并且將用戶請求切換到冗余集合內(nèi)的服務(wù)器;當(dāng)此服務(wù)器恢復(fù)正常負(fù)載后代理服務(wù)器再將其加載回系統(tǒng),以達(dá)到整體服務(wù)的容災(zāi)目的。本發(fā)明利用其調(diào)用機(jī)制及容災(zāi)策略可以最大程度的規(guī)避在分布式系統(tǒng)中,高訪問量導(dǎo)致服務(wù)不穩(wěn)定的風(fēng)險(xiǎn)??梢耘渲枚嘟M服務(wù)以達(dá)到訪問量分流的目的。對于一組服務(wù), 可以分為多個(gè)節(jié)點(diǎn)以達(dá)到數(shù)據(jù)分片的目的,同時(shí)起到災(zāi)備和數(shù)據(jù)冗余備份的功能。
圖I是實(shí)施本發(fā)明所述分布式應(yīng)用中分布式通訊方法的系統(tǒng)架構(gòu)圖;圖2是實(shí)施本發(fā)明所述分布式應(yīng)用中分布式通訊方法的子系統(tǒng)的架構(gòu)圖。
具體實(shí)施例方式為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式
對本發(fā)明作進(jìn)一步詳細(xì)的說明。本發(fā)明所述分布式應(yīng)用中分布式通訊方法正是基于圖I和圖2所示系統(tǒng)架構(gòu)實(shí)現(xiàn)了系統(tǒng)間一對一、一對多調(diào)用的分布式通訊。圖I是實(shí)施本發(fā)明所述分布式應(yīng)用中分布式通訊方法的系統(tǒng)架構(gòu)圖;如圖I所示,由多臺(tái)代理服務(wù)器負(fù)責(zé)將用戶請求分發(fā)到內(nèi)部的各個(gè)子系統(tǒng),子系統(tǒng)經(jīng)過各自獨(dú)立的運(yùn)算后將運(yùn)算結(jié)果返回給代理服務(wù)器,代理服務(wù)器再進(jìn)行一些匯總和后期處理,將最終結(jié)果返回給外部調(diào)用方。本發(fā)明解決了代理服務(wù)器向內(nèi)部子系統(tǒng)分發(fā)時(shí)的具體通訊細(xì)節(jié)和容錯(cuò)處理。調(diào)用機(jī)制為代理服務(wù)器可以向多個(gè)子系統(tǒng)分發(fā)請求,每個(gè)子系統(tǒng)可以有多臺(tái)服務(wù)器。分發(fā)請求的通訊細(xì)節(jié)將被封裝在本系統(tǒng)中。封裝的過程包含了通訊層封裝、連接池封裝、容災(zāi)策略封裝、動(dòng)態(tài)切換服務(wù)封裝,以及服務(wù)配置的封裝,其中重點(diǎn)為通訊層封裝,通訊層封裝基于 Javanio (具體內(nèi)容請參見http: //docs, oracle, com/iavase/6/docs/api/iava/nio/packaRe-summary. html)實(shí)現(xiàn),封裝了基于事件驅(qū)動(dòng)的異步Socket網(wǎng)絡(luò)通訊,并且基于集群多播的特點(diǎn)(分布式系統(tǒng)調(diào)用時(shí),往往需要向集群服務(wù)同時(shí)發(fā)起多份請求,等待集群服務(wù)并行處理并依次返回結(jié)果后,調(diào)用方即完成了一次調(diào)用。這種調(diào)用過程我們稱之為集群多播),提供了異步多播通訊的功能。所謂異步多播,指的是java nio通訊在網(wǎng)絡(luò)傳輸過程中,調(diào)用方不需要阻塞等待,所以可以利用此特性將一個(gè)集群調(diào)用的多份請求異步發(fā)送,以達(dá)到集群接收方可以幾乎同時(shí)接收到調(diào)用請求,馬上開始并行處理,大大提高了分布式系統(tǒng)的性能。在一次用戶請求到代理服務(wù)器后(單個(gè)請求),代理服務(wù)器可以通過本系統(tǒng),根據(jù)不同的業(yè)務(wù)調(diào)用不同的子系統(tǒng)集群。由于不同的子系統(tǒng)之間可能存在依賴關(guān)系,所以這里提供的是串行同步調(diào)用方式。也就是只有調(diào)用子系統(tǒng)A完成或超時(shí)后,才能調(diào)用子系統(tǒng)B ;當(dāng)調(diào)用子系統(tǒng)B完成或超時(shí)后,才能調(diào)用子系統(tǒng)C。但在調(diào)用一個(gè)子系統(tǒng)集群時(shí),考慮到不同機(jī)器之間可能不存在依賴關(guān)系,所以提供并行異步調(diào)用的方式。也就是當(dāng)調(diào)用子系統(tǒng)A集群時(shí),將用戶請求復(fù)制多份相同請求同時(shí)向子系統(tǒng)集群內(nèi)的多臺(tái)服務(wù)器發(fā)起,并且不會(huì)阻塞等待某一臺(tái)服務(wù)器返回結(jié)果,而是通過事件機(jī)制,當(dāng)調(diào)用方收到被調(diào)方返回結(jié)果的事件時(shí)觸發(fā)回調(diào)。當(dāng)回調(diào)次數(shù)等于服務(wù)器個(gè)數(shù)(或超時(shí))后,子系統(tǒng)集群調(diào)用結(jié)束。這種串行、并行混合的方式為調(diào)用者提供了多種選擇,可以按照不同需求選擇不同的調(diào)用方式。當(dāng)選擇并行異步調(diào)用方式時(shí),可以大大增強(qiáng)系統(tǒng)的性能,減少調(diào)用開銷。例如,在某分布式搜索的前端web服務(wù)接收到一個(gè)用戶請求后,它將先調(diào)用緩存集群(子系統(tǒng)A),如果緩存集群處理完畢并且沒有命中緩存的情況下,才會(huì)繼續(xù)調(diào)用索引集群(子系統(tǒng)B),而索引集群由于采用了分片索引(將索引數(shù)據(jù)分為多個(gè)節(jié)點(diǎn)分別存儲(chǔ)以提高系統(tǒng)的總存儲(chǔ)量),需要將多個(gè)相同請求同時(shí)發(fā)起給索引集群的所有節(jié)點(diǎn)以進(jìn)行并行計(jì)算,當(dāng)計(jì)算完畢后,調(diào)用方將集群計(jì)算結(jié)果匯總合并后,最終返回給用戶。整體上來看,分布式系統(tǒng)在外部調(diào)用方來看是不關(guān)心內(nèi)部具體的分發(fā)、容錯(cuò)機(jī)制的。
圖2是實(shí)施本發(fā)明所述分布式應(yīng)用中分布式通訊方法的子系統(tǒng)的架構(gòu)圖;圖2所示子系統(tǒng)為子系統(tǒng)A的內(nèi)部架構(gòu)圖,為了能夠支持災(zāi)備切換和分流并發(fā)量,在子系統(tǒng)內(nèi)部一般可以提供多組服務(wù)器,每組服務(wù)器的數(shù)量相同,并且一組服務(wù)器構(gòu)成一個(gè)完整數(shù)據(jù)集。多組服務(wù)器構(gòu)成多個(gè)完整數(shù)據(jù)集的冗余集合以分流并發(fā)請求??梢詾槊颗_(tái)服務(wù)器編號(hào),多組同號(hào)服務(wù)器稱之為一個(gè)“集群分支”,每個(gè)“集群分支”內(nèi)部的每臺(tái)服務(wù)器互為災(zāi)備,調(diào)用機(jī)制為針對子系統(tǒng)A的一次集群調(diào)用將同時(shí)發(fā)送三次相同的調(diào)用請求到子系統(tǒng)A內(nèi)部的三個(gè)集群分支,具體發(fā)送規(guī)則由負(fù)載均衡規(guī)則決定,其實(shí)現(xiàn)方式為在每一次集群調(diào)用前取得當(dāng)前集群內(nèi)的所有集群分支信息,遍歷每個(gè)集群分支,每次從一個(gè)集群分支中隨機(jī)取得一臺(tái)服務(wù)器,如果這臺(tái)服務(wù)器的狀態(tài)可用,則此服務(wù)器作為本次集群調(diào)用針對此集群分支的目標(biāo)服務(wù)器;否則將順序查找集群分支中的下一臺(tái)服務(wù)器的狀態(tài)是否可用,依此類推(如果當(dāng)前集群分支中的所有服務(wù)器狀態(tài)都不可用,則本次集群調(diào)用針對此集群分支將不發(fā)起請求)。當(dāng)子系統(tǒng)A內(nèi)部的三個(gè)集群分支的結(jié)果都返回或超時(shí)后,針對子系統(tǒng)A的一次集群調(diào)用結(jié)束。具體到集群調(diào)用的實(shí)現(xiàn),采用并行異步調(diào)用的方式調(diào)用每個(gè)子系統(tǒng)內(nèi)部的多臺(tái)服務(wù)器,其并行異步調(diào)用的通訊具體實(shí)現(xiàn)方式為對于每個(gè)子系統(tǒng)內(nèi)部的多臺(tái)服務(wù)器的并行異步調(diào)用,系統(tǒng)采用線程池來處理請求調(diào)用,這樣針對子系統(tǒng)A內(nèi)部的多臺(tái)服務(wù)器的調(diào)用將并行運(yùn)行在多個(gè)線程內(nèi)。具體實(shí)現(xiàn)采用了 java Executor線程池模型,并且使用固定最大線程數(shù)的池以避免線程過多,同時(shí)當(dāng)線程數(shù)達(dá)到最大線程數(shù)后,將線程任務(wù)放入緩沖隊(duì)列暫時(shí)緩沖,當(dāng)緩沖隊(duì)列滿后,開始泄洪策略(從隊(duì)列頭取出任務(wù)并拋棄),以保證系統(tǒng)的穩(wěn)定性。對于通訊傳輸過程,封裝了 java nio的底層通訊過程,用戶可以直接將通訊內(nèi)容以java對象的形式傳遞給本系統(tǒng),本系統(tǒng)內(nèi)部進(jìn)行對象的序列化編碼,然后再將序列化后的byte數(shù)組轉(zhuǎn)化為java nio的ByteBuffer,通過SocketChannel發(fā)送異步Socket通訊數(shù)據(jù)給集群中的某個(gè)節(jié)點(diǎn)服務(wù)器,隨后,當(dāng)java nio的Selector線程發(fā)現(xiàn)某節(jié)點(diǎn)服務(wù)器有返回?cái)?shù)據(jù)后,通過SocketChannel可以讀出ByteBuffer,再將其中的byte數(shù)組通過對象反序列化解碼為java對象。當(dāng)一次調(diào)用的集群中所有節(jié)點(diǎn)服務(wù)器都成功返回java對象后,將喚醒調(diào)用方線程繼續(xù)后續(xù)工作(或者當(dāng)調(diào)用方線程超過業(yè)務(wù)最大等待時(shí)間后自動(dòng)喚醒,并做相應(yīng)容錯(cuò)處理)。為了保證在通訊過程中的高性能,代理服務(wù)器與子系統(tǒng)的每臺(tái)服務(wù)器建立一定數(shù)量的Socket長連接,并且使用連接池技術(shù)管理這些鏈接。對于連接池的實(shí)現(xiàn),采取了活躍連接池、閑置連接池和管理線程三部分組成,當(dāng)系統(tǒng)需要Socket連接時(shí)會(huì)去閑置連接池中檢查是否有存留的閑置連接,如果有則直接取出以實(shí)現(xiàn)連接復(fù)用,否則創(chuàng)建一個(gè)新連接并放入活躍連接池然后返回此連接。當(dāng)系統(tǒng)對某個(gè)連接使用完畢后將此連接放入閑置連接池。當(dāng)閑置連接過多時(shí),管理線程會(huì)將其回收并關(guān)閉此連接,來保證系統(tǒng)不會(huì)因?yàn)殚e置連接過多而消耗過多系統(tǒng)資源。當(dāng)子系統(tǒng)的某個(gè)節(jié)點(diǎn)服務(wù)器宕機(jī)或壓力過大時(shí),代理服務(wù)器將用戶請求動(dòng)態(tài)分配到其它節(jié)點(diǎn)服務(wù)器,其具體實(shí)現(xiàn)方式為代理服務(wù)器使用健康檢查的方式保持與節(jié)點(diǎn)服務(wù)器之間通訊穩(wěn)定性的校驗(yàn),健康檢查策略分為定時(shí)健康檢查策略和基于統(tǒng)計(jì)的實(shí)時(shí)健康檢查策略,兩種策略在系統(tǒng)內(nèi)同時(shí)運(yùn)行,以確保能夠自動(dòng)發(fā)現(xiàn)被調(diào)方宕機(jī)、服務(wù)不穩(wěn)定等問題。一旦發(fā)現(xiàn)宕機(jī)或服務(wù)不穩(wěn)定,馬上采取熱備切換或功能降級(jí)將這些不穩(wěn)定的服務(wù)器從系統(tǒng)中暫時(shí)摘除,并且將用戶請求切換到冗余集合內(nèi)的服務(wù)器。當(dāng)被摘除的服務(wù)器恢復(fù)服 務(wù)后,本系統(tǒng)可以馬上發(fā)現(xiàn)并將此服務(wù)器重新加載回系統(tǒng)中。定時(shí)健康檢查策略根據(jù)一定時(shí)間間隔(用戶可以設(shè)置此時(shí)間間隔,不設(shè)置則使用默認(rèn)值10秒)進(jìn)行輪詢檢查,輪詢到每臺(tái)服務(wù)器后發(fā)送健康檢查請求,根據(jù)服務(wù)器的返回來確定服務(wù)器狀態(tài)是否健康。當(dāng)發(fā)現(xiàn)某臺(tái)服務(wù)器的連通失敗率高于一定閥值(用戶可以設(shè)置此閥值,不設(shè)置則默認(rèn)向每臺(tái)服務(wù)器訪問10次,最高失敗率為60%)時(shí),馬上將這臺(tái)服務(wù)器標(biāo)記為暫停服務(wù)狀態(tài),當(dāng)調(diào)用方發(fā)現(xiàn)目標(biāo)調(diào)用服務(wù)器為暫停服務(wù)狀態(tài)時(shí),將繞開此服務(wù)器,調(diào)用集群分支中的其它服務(wù)器。直到某次輪詢檢查發(fā)現(xiàn)曾經(jīng)被標(biāo)記為暫停狀態(tài)的服務(wù)器能夠成功連通后,再重新將此服務(wù)器標(biāo)記為正常服務(wù)狀態(tài)。之后調(diào)用方會(huì)自動(dòng)恢復(fù)對此服務(wù)器的調(diào)用?;诮y(tǒng)計(jì)的實(shí)時(shí)健康檢查策略首先記錄下近期(默認(rèn)為最近5秒內(nèi))每臺(tái)被調(diào)用服務(wù)器的調(diào)用成功、失敗次數(shù),當(dāng)調(diào)用失敗次數(shù)超過“失敗次數(shù)閥值”(默認(rèn)為100次),或調(diào)用失敗率超過“失敗率閥值”(默認(rèn)為50%)后,都會(huì)將此臺(tái)服務(wù)器標(biāo)記為暫停服務(wù)狀態(tài),直到定時(shí)健康檢查策略再次發(fā)現(xiàn)此服務(wù)器能夠成功連通后,再重新將此服務(wù)器標(biāo)記為正常服務(wù)狀態(tài)。這里之所以需要失敗次數(shù)閥值和失敗比率閥值兩個(gè)值來定義服務(wù)器失敗,是因?yàn)樵谙到y(tǒng)并發(fā)訪問量較低時(shí),失敗比率容易超過“失敗率閥值”,而在系統(tǒng)并發(fā)訪問量較高時(shí),失敗次數(shù)容易超過“失敗次數(shù)閥值”。這樣無論在任何情況下,只要服務(wù)的穩(wěn)定性較低,都能夠觸發(fā)健康檢查機(jī)制,并馬上采取自動(dòng)容災(zāi)策略。當(dāng)某個(gè)集群分支內(nèi)的所有服務(wù)器都被標(biāo)記為暫停服務(wù)狀態(tài)時(shí),默認(rèn)將啟用功能降級(jí)策略(可以配置為不啟用)。此時(shí)所在的子系統(tǒng)在短暫時(shí)間內(nèi)將不再請求這個(gè)集群分支內(nèi)的任何服務(wù)器。這樣保證了在任何情況下(超高負(fù)載、內(nèi)部多臺(tái)服務(wù)器異常、內(nèi)網(wǎng)通訊異常)整體系統(tǒng)的可用性,避免了由于多臺(tái)服務(wù)器異常導(dǎo)致的整體服務(wù)崩潰的狀況。進(jìn)一步的,以基于統(tǒng)計(jì)的健康檢查為例,其內(nèi)部具體實(shí)現(xiàn)方式為建立一個(gè)ConcurrentHashMap<Long, Atomiclnteger〉對象用來記錄調(diào)用方近期每一秒的總調(diào)用次數(shù),其中key為某一秒的時(shí)間戳,value為調(diào)用次數(shù)。建立一個(gè)ConcurrentHashMap〈Long, FallAddressMap>對象用來記錄調(diào)用方近期每一秒的失敗調(diào)用信息,其中key代表某一秒的時(shí)間戳,value代表調(diào)用失敗信息。調(diào)用失敗信息對象內(nèi)部存儲(chǔ)了一個(gè)ConcurrentHashMap〈InetSocketAddress, Atomiclnteger)對象,它的key代表某個(gè)Socket地址信息,value代表某個(gè)Socket在某一秒內(nèi)的失敗次數(shù)。這樣就可以記錄下每一秒內(nèi)針對所有Socket的失敗次數(shù)。啟動(dòng)一個(gè)線程,定時(shí)清理總調(diào)用次數(shù)map中20秒前的Entry,同時(shí)清理失敗調(diào)用信息map中20秒前的Entry,以避免歷史記錄信息過多而導(dǎo)致內(nèi)存溢出。啟動(dòng)一個(gè)線程,定時(shí)取得最近5秒的總調(diào)用次數(shù),同時(shí)取得最近5秒的調(diào)用失敗信息對象。依次遍歷這些調(diào)用失敗信息對象中的Socket對象,如果某個(gè)Socket對象計(jì)算出來的失敗次數(shù)或失敗比率符合設(shè)置的閥值,則設(shè)置此服務(wù)器為暫停服務(wù)狀態(tài)。并且將此失敗服務(wù)器信息追加到預(yù)備報(bào)警List中去。最后遍歷報(bào)警List,取出所有失敗服務(wù)器信息并且發(fā)送報(bào)警事件給所有報(bào)警監(jiān)聽者(本系統(tǒng)不限制具體的報(bào)警方式,僅提供報(bào)警監(jiān)聽接口,調(diào)用方可以實(shí)現(xiàn)監(jiān)聽接口并注冊監(jiān)聽。當(dāng)有服務(wù)器異常事件發(fā)生時(shí),本系統(tǒng)自動(dòng)調(diào)用注冊的所有監(jiān)聽者,通知相應(yīng)的報(bào)警事件發(fā)生。這樣監(jiān)聽者可以根據(jù)事件的回調(diào)信息自主選擇不同的報(bào)警方式如短信報(bào)警或郵件報(bào)警等)。這里使用兩種健康檢查策略的好處是,定時(shí)健康檢查策略由于在每次健康檢查時(shí)都需要向目標(biāo)服務(wù)器發(fā)起健康檢查請求,所以往往無法平衡健康檢查的時(shí)效性和健康檢查對系統(tǒng)性能造成影響這兩方面的矛盾,如果定時(shí)健康檢查的間隔時(shí)間較長,則健康檢查時(shí) 效性會(huì)較低,如果間隔較短,則健康檢查對目標(biāo)服務(wù)器又會(huì)造成較大負(fù)載壓力。而基于統(tǒng)計(jì)的實(shí)時(shí)健康檢查在每次請求調(diào)用開始和結(jié)束時(shí)僅僅做計(jì)數(shù)動(dòng)作(記錄每個(gè)Socket連接每一秒的總調(diào)用次數(shù)、失敗調(diào)用次數(shù)),所以統(tǒng)計(jì)定時(shí)器可以以非常短的間隔(間隔在毫秒級(jí)另Ij)不斷統(tǒng)計(jì)內(nèi)存中每個(gè)Socket的調(diào)用失敗次數(shù)和調(diào)用失敗率,當(dāng)此比率超過設(shè)定值后馬上做容災(zāi)處理。這樣,以基于統(tǒng)計(jì)的健康檢查為判斷目標(biāo)服務(wù)器是否需要摘除的主要手段,以定時(shí)健康檢查為恢復(fù)以前已經(jīng)摘除的服務(wù)器的主要手段,即保證了健康檢查的時(shí)效性,又保證了健康檢查對系統(tǒng)性能不會(huì)造成影響。在使用者具體使用本系統(tǒng)時(shí),為了解決業(yè)務(wù)系統(tǒng)和通訊框架之間調(diào)用的復(fù)雜性,將業(yè)務(wù)層和通訊層完全解耦,本系統(tǒng)設(shè)計(jì)為使用配置文件進(jìn)行服務(wù)配置,運(yùn)維工程師在配置文件中指定業(yè)務(wù)代號(hào)和集群服務(wù)器的調(diào)用策略之間的關(guān)系。這樣業(yè)務(wù)調(diào)用方調(diào)用本通訊框架時(shí)只需要關(guān)心分配給本業(yè)務(wù)的業(yè)務(wù)代號(hào),將業(yè)務(wù)代號(hào)和業(yè)務(wù)請求內(nèi)容發(fā)送給通訊框架即可。其配置方式遵循“約定優(yōu)于配置”的原則,使用者可以只提供極少的配置就可以馬上使用此系統(tǒng)。在系統(tǒng)加載配置文件過程中,如果發(fā)現(xiàn)使用者沒有提供可選配置(比如Socket連接池的池大小、定時(shí)健康檢查的時(shí)間間隔、線程池的最大線程個(gè)數(shù)等),則會(huì)使用該配置的默認(rèn)值作為系統(tǒng)參數(shù)加載(此默認(rèn)值是通過大量壓力測試和線上運(yùn)營后找到的大并發(fā)情況下的較優(yōu)值。當(dāng)然,使用者也可以根據(jù)自己的業(yè)務(wù)特點(diǎn)、服務(wù)器狀況等因素對這些參數(shù)進(jìn)行調(diào)優(yōu),并定義在自己的配置文件中)。本發(fā)明價(jià)值在于利用其調(diào)用機(jī)制及容災(zāi)策略可以最大程度的規(guī)避在分布式系統(tǒng)中,高訪問量導(dǎo)致服務(wù)不穩(wěn)定的風(fēng)險(xiǎn)。例如,對于某一個(gè)業(yè)務(wù)代號(hào),可以配置多組服務(wù)以達(dá)到訪問量分流的目的。對于一組服務(wù),又可以分為多個(gè)節(jié)點(diǎn)以達(dá)到數(shù)據(jù)分片的目的。這樣當(dāng)流量增加,系統(tǒng)可以水平伸縮(增加多組服務(wù)器),當(dāng)某組服務(wù)的某臺(tái)分片服務(wù)器宕機(jī),通過健康檢查機(jī)制,其它組同分支下的分片服務(wù)器馬上起到災(zāi)備和數(shù)據(jù)冗余備份的功能。最后應(yīng)當(dāng)說明的是以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非對其限制;盡管參照較佳實(shí)施例對本發(fā)明進(jìn)行了詳細(xì)的說明,所屬領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解依然可以對本發(fā)明的具體實(shí)施方式
進(jìn)行修改或者對部分技術(shù)特征進(jìn)行等同替換;而不脫離本發(fā)明技術(shù)方案的精神,其均應(yīng) 涵蓋在本發(fā)明請求保護(hù)的技術(shù)方案范圍當(dāng)中。
權(quán)利要求
1.一種分布式應(yīng)用中分布式通訊方法,其特征在于包括如下步驟 Si,由代理服務(wù)器將用戶請求分發(fā)到內(nèi)部的多個(gè)子系統(tǒng); S2,串行同步調(diào)用所述多個(gè)子系統(tǒng); 53,每個(gè)子系統(tǒng)設(shè)置多臺(tái)服務(wù)器,采用并行異步調(diào)用的方式調(diào)用每個(gè)子系統(tǒng)內(nèi)部的所述多臺(tái)服務(wù)器; 54,當(dāng)子系統(tǒng)的某個(gè)節(jié)點(diǎn)服務(wù)器宕機(jī)或壓力過大時(shí),代理服務(wù)器將用戶請求動(dòng)態(tài)分配到其它節(jié)點(diǎn)服務(wù)器; S5,子系統(tǒng)經(jīng)過各自獨(dú)立的運(yùn)算后將運(yùn)算結(jié)果返回給代理服務(wù)器,代理服務(wù)器再進(jìn)行匯總處理并返回給外部調(diào)用方。
2.根據(jù)權(quán)利要求I所述的分布式應(yīng)用中分布式通訊方法,其特征在于步驟S2中所述串行同步調(diào)用所述多個(gè)子系統(tǒng)的過程具體為只有調(diào)用一個(gè)子系統(tǒng)完成或超時(shí)后,才能調(diào)用另一子系統(tǒng),依次類推。
3.根據(jù)權(quán)利要求I所述的分布式應(yīng)用中分布式通訊方法,其特征在于步驟S3中采用并行異步調(diào)用的方式調(diào)用每個(gè)子系統(tǒng)內(nèi)部的多臺(tái)服務(wù)器過程具體為將用戶請求復(fù)制多份相同請求同時(shí)向子系統(tǒng)集群內(nèi)的多臺(tái)服務(wù)器發(fā)起,并且不會(huì)阻塞等待某一臺(tái)服務(wù)器返回結(jié)果,而是通過事件機(jī)制,當(dāng)調(diào)用方收到被調(diào)方返回結(jié)果的事件時(shí)觸發(fā)回調(diào),當(dāng)回調(diào)次數(shù)等于服務(wù)器個(gè)數(shù)或超時(shí)后,子系統(tǒng)集群調(diào)用結(jié)束。
4.根據(jù)權(quán)利要求I或3所述的分布式應(yīng)用中分布式通訊方法,其特征在于在所述子系統(tǒng)內(nèi)設(shè)置多組服務(wù)器,每組服務(wù)器的數(shù)量相同,并且一組服務(wù)器構(gòu)成一個(gè)完整數(shù)據(jù)集,多組服務(wù)器構(gòu)成多個(gè)完整數(shù)據(jù)集的冗余集合以分流并發(fā)請求。
5.根據(jù)權(quán)利要求I所述的分布式應(yīng)用中分布式通訊方法,其特征在于步驟S4中所述當(dāng)子系統(tǒng)的某個(gè)節(jié)點(diǎn)服務(wù)器宕機(jī)或壓力過大時(shí),代理服務(wù)器將用戶請求動(dòng)態(tài)分配到其它節(jié)點(diǎn)服務(wù)器的過程具體為代理服務(wù)器通過與子系統(tǒng)內(nèi)的每臺(tái)服務(wù)器保持通訊穩(wěn)定性的校驗(yàn)來確定服務(wù)器的負(fù)載情況,當(dāng)某臺(tái)子系統(tǒng)服務(wù)器負(fù)載過高時(shí),代理服務(wù)器將子系統(tǒng)服務(wù)器暫時(shí)從系統(tǒng)內(nèi)摘除,并且將用戶請求切換到冗余集合內(nèi)的服務(wù)器;當(dāng)此服務(wù)器恢復(fù)正常負(fù)載后代理服務(wù)器再將其加載回系統(tǒng),以達(dá)到整體服務(wù)的容災(zāi)目的。
全文摘要
一種分布式應(yīng)用中的分布式通訊方法,包括如下步驟S1,由代理服務(wù)器將用戶請求分發(fā)到內(nèi)部的多個(gè)子系統(tǒng);S2,串行同步調(diào)用所述多個(gè)子系統(tǒng);S3,每個(gè)子系統(tǒng)設(shè)置多臺(tái)服務(wù)器,采用并行異步調(diào)用的方式調(diào)用子系統(tǒng)內(nèi)部的所述多臺(tái)服務(wù)器;S4,當(dāng)子系統(tǒng)的某個(gè)節(jié)點(diǎn)服務(wù)器宕機(jī)或壓力過大時(shí),代理服務(wù)器將用戶請求動(dòng)態(tài)分配到其它節(jié)點(diǎn)服務(wù)器;S5,子系統(tǒng)經(jīng)過各自獨(dú)立的運(yùn)算后將運(yùn)算結(jié)果返回給代理服務(wù)器,代理服務(wù)器再進(jìn)行匯總處理并返回給外部調(diào)用方。
文檔編號(hào)H04L29/08GK102739799SQ20121023054
公開日2012年10月17日 申請日期2012年7月4日 優(yōu)先權(quán)日2012年7月4日
發(fā)明者盧述奇, 姚健, 尹玉宗, 潘柏宇, 蘆偉, 賈保珍, 高嵩 申請人:合一網(wǎng)絡(luò)技術(shù)(北京)有限公司