亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種提高基于構(gòu)件軟件系統(tǒng)可靠性的方法

文檔序號(hào):7615177閱讀:189來(lái)源:國(guó)知局
專利名稱:一種提高基于構(gòu)件軟件系統(tǒng)可靠性的方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種應(yīng)用服務(wù)器集群與容錯(cuò)的方法,特別涉及一種提高基于構(gòu)件軟件系統(tǒng)的可靠性方法。
背景技術(shù)
服務(wù)器端Java平臺(tái)(J2EE標(biāo)準(zhǔn))業(yè)已成為提供Web信息服務(wù)的最佳方法。對(duì)于關(guān)鍵業(yè)務(wù)系統(tǒng)來(lái)說(shuō),可靠性已成為互連網(wǎng)的一大挑戰(zhàn)。直接影響關(guān)鍵業(yè)務(wù)用戶或業(yè)務(wù)伙伴的故障是無(wú)法接受的?;A(chǔ)結(jié)構(gòu)必須具備很高的可用性,才能夠向企業(yè)提供不間斷的服務(wù)。
在當(dāng)今動(dòng)態(tài)業(yè)務(wù)環(huán)境下,為了滿足需求,企業(yè)必須具備動(dòng)態(tài)提高容量的能力。支持這種應(yīng)用的基礎(chǔ)結(jié)構(gòu)必須具備相當(dāng)高的伸縮性,以便在不改變軟件和硬件的情況下進(jìn)行接近線性的擴(kuò)展。因此支持對(duì)于J2EE平臺(tái)的集群,負(fù)載平衡和錯(cuò)誤恢復(fù),是一個(gè)性能優(yōu)良,可擴(kuò)展,穩(wěn)定的應(yīng)用服務(wù)器必須支持的特性。集群是一組相互獨(dú)立的服務(wù)器在網(wǎng)絡(luò)中表現(xiàn)為單一的系統(tǒng),并以單一系統(tǒng)的模式加以管理。此單一系統(tǒng)為客戶工作站提供高可靠性的服務(wù)。多數(shù)情況下,集群中所有的計(jì)算機(jī)擁有一個(gè)共同的名稱,集群內(nèi)任意一個(gè)系統(tǒng)上運(yùn)行的服務(wù)可被所有的網(wǎng)絡(luò)客戶所使用。集群必須可以協(xié)調(diào)管理各分離組件的錯(cuò)誤和失敗,并可透明地向集群中加入組件。一個(gè)集群包含多臺(tái)(至少二臺(tái))擁有共享數(shù)據(jù)存儲(chǔ)空間的服務(wù)器。任何一臺(tái)服務(wù)器運(yùn)行一個(gè)應(yīng)用時(shí),應(yīng)用數(shù)據(jù)被存儲(chǔ)在共享的數(shù)據(jù)空間內(nèi)。每臺(tái)服務(wù)器的操作系統(tǒng)和應(yīng)用程序文件存儲(chǔ)在其各自的本地儲(chǔ)存空間上。集群內(nèi)各節(jié)點(diǎn)服務(wù)器通過(guò)內(nèi)部局域網(wǎng)相互通訊。當(dāng)一臺(tái)節(jié)點(diǎn)服務(wù)器發(fā)生故障時(shí),這臺(tái)服務(wù)器上所運(yùn)行的應(yīng)用程序?qū)⒃诹硪还?jié)點(diǎn)服務(wù)器上被自動(dòng)接管。當(dāng)一個(gè)應(yīng)用服務(wù)發(fā)生故障時(shí),應(yīng)用服務(wù)將被重新啟動(dòng)或被另一臺(tái)服務(wù)器接管。當(dāng)以上的任一故障發(fā)生時(shí),客戶都將能很快連接到新的應(yīng)用服務(wù)上。對(duì)于用于大型企業(yè)級(jí)應(yīng)用的J2EE服務(wù)器來(lái)說(shuō),集群服務(wù)是必要的。但是J2EE規(guī)范中并沒(méi)有對(duì)集群方面內(nèi)容做出規(guī)定,所以對(duì)于集群的實(shí)現(xiàn)都是由具體的服務(wù)器來(lái)各自決定的。應(yīng)用服務(wù)器作為企業(yè)級(jí)的應(yīng)用服務(wù)器,需要處理大量且并發(fā)的請(qǐng)求,同時(shí)這些處理過(guò)程中的數(shù)據(jù)都是重要而不允許出錯(cuò)的。為了提高大量訪問(wèn)情況下的性能以及滿足可靠性的要求,應(yīng)用服務(wù)器需要負(fù)載均衡和容錯(cuò)的能力,提供應(yīng)用服務(wù)器以下新的特性可擴(kuò)展性是指一個(gè)應(yīng)用程序能支持不斷增長(zhǎng)的用戶數(shù)量的能力。當(dāng)由于某種需要?jiǎng)討B(tài)添加和減少服務(wù)器,不會(huì)對(duì)系統(tǒng)造成影響。通常由于系統(tǒng)負(fù)載量的增加,需要?jiǎng)討B(tài)添加新的服務(wù)器,因此這對(duì)客戶的調(diào)用應(yīng)該是透明的,不會(huì)中斷其他服務(wù)器的工作;可靠性可靠性是指系統(tǒng)有一定程度的冗余能力。在集群系統(tǒng)中,某個(gè)節(jié)點(diǎn)的崩潰不會(huì)影響系統(tǒng)的服務(wù),系統(tǒng)能夠自動(dòng)遷移任務(wù),能夠處理這個(gè)任務(wù)的服務(wù)器自動(dòng)處理客戶的請(qǐng)求。
從上面集群需要支持的特性可以看出,集群包括了負(fù)載均衡和容錯(cuò)兩個(gè)方面。負(fù)載均衡使得服務(wù)器群共同分擔(dān)工作負(fù)載,它采用某種負(fù)載分配策略,優(yōu)化服務(wù)器的性能。而且所有這些工作對(duì)于客戶的訪問(wèn)是透明的,不需要客戶的干預(yù)。理想狀況下,如果集群中的每個(gè)服務(wù)器有著相同的處理能力,那么承擔(dān)相同的負(fù)載量。因此每個(gè)負(fù)載的分配算法和服務(wù)器自身的性能有關(guān),如何收集、處理這些信息,以及采用什么樣的算法來(lái)分配負(fù)載。容錯(cuò)采用多數(shù)據(jù)復(fù)本,允許某種程度的錯(cuò)誤和失敗。在理想情況下,錯(cuò)誤恢復(fù)應(yīng)該對(duì)于客戶是完全透明的。當(dāng)一個(gè)服務(wù)器失敗時(shí),正在和這個(gè)服務(wù)器進(jìn)行交互的客戶能夠自動(dòng)轉(zhuǎn)交為其它服務(wù)器。錯(cuò)誤恢復(fù)的關(guān)鍵點(diǎn)是客戶能夠持續(xù)利用服務(wù)器的服務(wù),即使某些應(yīng)用服務(wù)器發(fā)生故障,而且在服務(wù)器修復(fù)之后,立即可以和其它服務(wù)器一起提供服務(wù),所有這些僅僅和服務(wù)器群有關(guān),客戶端完全不需要知道。正如我們上面所分析的,對(duì)于用于大型企業(yè)級(jí)應(yīng)用的J2EE服務(wù)器來(lái)說(shuō),集群服務(wù)是必要的。當(dāng)前的應(yīng)用服務(wù)器大多不支持細(xì)粒度的集群,并且不支持方法級(jí)的請(qǐng)求重定向,以及對(duì)象組的狀態(tài)復(fù)制技術(shù),J2EE規(guī)范中并沒(méi)有對(duì)集群方面內(nèi)容做出規(guī)定,所以對(duì)于集群的實(shí)現(xiàn)都是由具體的服務(wù)器來(lái)各自決定的。

發(fā)明內(nèi)容
本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)的缺點(diǎn),提供了一種提高基于構(gòu)件軟件系統(tǒng)可靠性的方法,此方法能夠?qū)崿F(xiàn)多個(gè)節(jié)點(diǎn)的JToneFrame應(yīng)用服務(wù)器集群在不停止服務(wù)的情況下,動(dòng)態(tài)加載、刪除集群內(nèi)的節(jié)點(diǎn);支持水平和垂直分割;對(duì)象級(jí)和方法級(jí)EJB容器負(fù)載平衡;支持無(wú)狀態(tài)會(huì)話Bean,狀態(tài)會(huì)話Bean和實(shí)體Bean的集群。為達(dá)到上述目的,本發(fā)明采用的技術(shù)方案是首先由客戶通過(guò)其客戶端組件接口代理發(fā)出一個(gè)服務(wù)器調(diào)用請(qǐng)求;遵照EJB2.1規(guī)范的EJB組件,在其擴(kuò)展部署描述符中添加負(fù)載均衡和容錯(cuò)功能標(biāo)簽,指示EJB組件支持集群功能和默認(rèn)采用隨機(jī)分配負(fù)載均衡算法,通過(guò)預(yù)編譯器對(duì)EJB組件進(jìn)行編譯,生成相應(yīng)的EJBHome和EJBObject接口的實(shí)現(xiàn)類,并且對(duì)其生成實(shí)現(xiàn)類的Stub,使用預(yù)編譯工具改變Stub類原有遠(yuǎn)程調(diào)用的執(zhí)行邏輯,在每次業(yè)務(wù)方法調(diào)用前,請(qǐng)求服務(wù)器端的EJB組件的各個(gè)服務(wù)器的引用列表,實(shí)現(xiàn)請(qǐng)求的再分配;客戶的請(qǐng)求隨機(jī)由服務(wù)器群中任一服務(wù)器接收,這個(gè)服務(wù)器使用底層的服務(wù)器組通訊協(xié)議和其它服務(wù)器進(jìn)行通訊,根據(jù)EJB組件的擴(kuò)展部署描述符,客戶根據(jù)自己的需要選擇負(fù)載參數(shù),如果客戶有自己定制的負(fù)載參數(shù)和分配策略,則裝載客戶自己定制的參數(shù)和策略,然后根據(jù)裝載定制參數(shù)和策略模塊,在其它服務(wù)器上調(diào)用負(fù)載收集命令,在各個(gè)節(jié)點(diǎn)收集負(fù)載信息;如果客戶沒(méi)有定制此項(xiàng),服務(wù)器可以裝載默認(rèn)的參數(shù)和分配策略;定義負(fù)載參數(shù)系統(tǒng)基本運(yùn)行環(huán)境參數(shù)在基于J2EE應(yīng)用服務(wù)器中間件系統(tǒng)中,系統(tǒng)基本運(yùn)行環(huán)境參數(shù)定義為JVM的堆大小、使用內(nèi)存;組件容器組件容器包含Servlet容器和EJB容器,Servlet容器參數(shù)包含Servlet運(yùn)行數(shù)量和用戶單位事件請(qǐng)求數(shù)量,EJB容器參數(shù)包括分別為SessionBean組件、EentityBean組件和MessageDriverBean組件而建立的其創(chuàng)建組件數(shù)量、運(yùn)行組件數(shù)量、池態(tài)組件數(shù)量;其它引用的資源按照其類別分為數(shù)據(jù)源資源、JCA資源、JMS資源,定義其連接數(shù)量參數(shù)、可用連接數(shù)量資源和等待引用資源數(shù)量;根據(jù)以上的負(fù)載參數(shù)定義,動(dòng)態(tài)計(jì)算當(dāng)前時(shí)刻的服務(wù)器負(fù)載量Li(t)=αB(t)+βC(t)+λR(t),B(t)表示在時(shí)刻t系統(tǒng)基本運(yùn)行環(huán)境負(fù)載量,C(t)表示組件容器在t時(shí)刻的負(fù)載量,R(t)表示t時(shí)刻資源引用量,α,β,λ分別表示權(quán)重,則t時(shí)刻的服務(wù)器群的負(fù)載總量為L(zhǎng)(t)=Σi=1nLi(t),]]>當(dāng)前時(shí)刻的閾值為T(t)=L(t)n,]]>當(dāng)Li(t)>T(t)時(shí),請(qǐng)求被重定向到一個(gè)輕載服務(wù)器上運(yùn)行;根據(jù)各個(gè)節(jié)點(diǎn)收集的負(fù)載信息,將整個(gè)服務(wù)器各個(gè)節(jié)點(diǎn)負(fù)載信息進(jìn)行加權(quán)計(jì)算得出其負(fù)載值,依據(jù)此值進(jìn)行排序,返回給客戶接口代理所有可用的服務(wù)器列表;客戶根據(jù)返回的這個(gè)列表順序選擇節(jié)點(diǎn),將負(fù)載最輕的節(jié)點(diǎn)取出引用,并根據(jù)服務(wù)器引用發(fā)出請(qǐng)求,此時(shí)請(qǐng)求將會(huì)在輕載節(jié)點(diǎn)上進(jìn)行執(zhí)行;如果這個(gè)節(jié)點(diǎn)能夠正確處理請(qǐng)求,沒(méi)有異常拋出,則同步其它節(jié)點(diǎn)的狀態(tài)信息,以保證下一次請(qǐng)求調(diào)用和分配的正確性,如果調(diào)用不成功,客戶端的請(qǐng)求則返回客戶節(jié)點(diǎn)列表,根據(jù)服務(wù)器的節(jié)點(diǎn)列表選擇下一個(gè)輕載的服務(wù)器節(jié)點(diǎn),調(diào)用EJB組件的業(yè)務(wù)方法,當(dāng)節(jié)點(diǎn)列表的所有節(jié)點(diǎn)都發(fā)生故障時(shí),客戶調(diào)用將不會(huì)被正確處理。
由于本發(fā)明采用分布式負(fù)載分配策略,不存在集中的負(fù)載分配器,不存在單點(diǎn)失效的可能性,且也不把負(fù)載分配器獨(dú)立出來(lái),而是將負(fù)載分配器作為每個(gè)節(jié)點(diǎn)的一個(gè)組件,這樣就解決了集中式的問(wèn)題,把請(qǐng)求的分配分散到各個(gè)節(jié)點(diǎn)上。


圖1是客戶端的調(diào)用形式圖;圖2為兩個(gè)服務(wù)器復(fù)本節(jié)點(diǎn)組成的集群系統(tǒng)。
具體實(shí)施例方式
下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。
為了實(shí)現(xiàn)上述的應(yīng)用服務(wù)器集群與容錯(cuò)技術(shù)內(nèi)容,本發(fā)明將實(shí)施分為EJB組件客戶端和服務(wù)器端實(shí)施方式兩個(gè)部分,客戶端首先由客戶通過(guò)客戶端組件接口代理發(fā)出一個(gè)服務(wù)器調(diào)用請(qǐng)求;客戶端負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā)的工作。這些工作具體都是由RMI體系中的客戶代理(Stub)來(lái)完成的。客戶端Stub將來(lái)自客戶端的業(yè)務(wù)方法調(diào)用請(qǐng)求發(fā)送到任一服務(wù)器復(fù)本節(jié)點(diǎn)上,并且通過(guò)將實(shí)際調(diào)用動(dòng)作上移到其超類中而實(shí)現(xiàn)容錯(cuò)。然后由客戶端stub進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),客戶端stub必須持有服務(wù)器端的信息,因此在每個(gè)服務(wù)器節(jié)點(diǎn)上同步維護(hù)整個(gè)服務(wù)器組的列表視圖,而這個(gè)信息就保存在成員域server中。server中的具體內(nèi)容,是此EJB在各個(gè)服務(wù)器復(fù)本節(jié)點(diǎn)上生成的客戶端stub(包括home stub和remote stub)??蛻舳藄tub只需從其中取出任一服務(wù)器節(jié)點(diǎn)的stub,獲得它的remote reference,用它來(lái)替代自身的remotereference,然后讓業(yè)務(wù)方法調(diào)用發(fā)生在現(xiàn)在的remote reference上,即可順利的將業(yè)務(wù)方法調(diào)用發(fā)送到stub對(duì)應(yīng)的服務(wù)器復(fù)本節(jié)點(diǎn)上。
參見(jiàn)圖1,1、客戶端Stub在加入了getServerList()方法之后,客戶端最初沒(méi)有進(jìn)行任何方法調(diào)用,server中的內(nèi)容只有一個(gè),就是持有它的客戶端stub本身。
2、在每次客戶端進(jìn)行業(yè)務(wù)方法調(diào)用之前,客戶端Stub都會(huì)進(jìn)行g(shù)etServerList()方法的調(diào)用而獲得服務(wù)器列表,以集群系統(tǒng)的當(dāng)前服務(wù)器復(fù)本列表來(lái)更新本地的server內(nèi)容然后返回服務(wù)器列表給客戶端Stub。getServerList()方法的實(shí)現(xiàn)在服務(wù)器端的Home/Remote接口的實(shí)現(xiàn)類中,所以客戶端stub進(jìn)行的getServerList()方法調(diào)用實(shí)際上也是一次遠(yuǎn)程方法調(diào)用。
3、當(dāng)客戶端獲得了服務(wù)器列表后,客戶端stub從列表中選取一個(gè)節(jié)點(diǎn),再次進(jìn)行業(yè)務(wù)方法調(diào)用,服務(wù)器接收到此業(yè)務(wù)方法調(diào)用后,調(diào)用實(shí)際部署EJB的Bean實(shí)例的方法,然后給客戶端返回調(diào)用結(jié)果。
為了實(shí)現(xiàn)以上功能,可以采用代碼自動(dòng)生成技術(shù),并且定義擴(kuò)展部署描述符,擴(kuò)展部署描述符遵照EJB2.1規(guī)范的EJB組件,在其擴(kuò)展部署描述符中添加負(fù)載均衡和容錯(cuò)功能標(biāo)簽,指示EJB組件支持集群功能和默認(rèn)采用隨機(jī)分配負(fù)載均衡算法,通過(guò)預(yù)編譯器對(duì)EJB組件進(jìn)行編譯,生成相應(yīng)的EJBHome和EJBObject接口的實(shí)現(xiàn)類,并且對(duì)其生成實(shí)現(xiàn)類的Stub進(jìn)行修改,改變?cè)羞h(yuǎn)程調(diào)用的執(zhí)行邏輯,在每次業(yè)務(wù)方法調(diào)用前,請(qǐng)求服務(wù)器端的EJB組件的各個(gè)服務(wù)器的引用列表,可以實(shí)現(xiàn)請(qǐng)求的再分配;預(yù)編譯過(guò)程通過(guò)如下步驟1、通過(guò)部署描述符和反射機(jī)制來(lái)獲取輸入的jar文件的元信息,將其與模板文件相結(jié)合從而生成EJB實(shí)現(xiàn)類的源文件。
2、調(diào)用javac編譯生成的源文件從而得到類文件。
3、調(diào)用rmic來(lái)生成相應(yīng)的stub和skeleton文件。這里保留生成的stub和skeleton的源文件。
4、修改stub和skeleton源文件加入對(duì)事務(wù)和安全的支持。
5、重新編譯修改后的stub和skeleton文件,得到新的類文件。
6、最后以這些生成的類文件來(lái)更新輸入的jar文件。
7、最終輸出內(nèi)容包括實(shí)現(xiàn)類、stub和skeleton類和原有客戶端定義的類文件的新的jar(ear)文件。
底層的服務(wù)器組通訊協(xié)議和其它服務(wù)器進(jìn)行通訊是保障服務(wù)器統(tǒng)一視圖的標(biāo)準(zhǔn),是服務(wù)器間調(diào)用的總線。
1、客戶的請(qǐng)求由預(yù)編譯生產(chǎn)stub代理發(fā)起;2、客戶的請(qǐng)求隨機(jī)由服務(wù)器群中某個(gè)服務(wù)器接收,這個(gè)服務(wù)器使用底層的服務(wù)器組通訊協(xié)議和其它服務(wù)器進(jìn)行通訊;3、接收請(qǐng)求的服務(wù)器節(jié)點(diǎn)向其它服務(wù)器發(fā)出負(fù)載收集命令,在各個(gè)節(jié)點(diǎn)的負(fù)載均衡器發(fā)出收集負(fù)載信息。底層的收集器收集各個(gè)節(jié)點(diǎn)的系統(tǒng)基本運(yùn)行環(huán)境參數(shù);組件容器,和其它引用資源三類負(fù)載參數(shù),動(dòng)態(tài)計(jì)算當(dāng)前時(shí)刻的服務(wù)器負(fù)載量Li(t)=αB(t)+βC(t)+λR(t),B(t)表示在時(shí)刻t系統(tǒng)基本運(yùn)行環(huán)境負(fù)載量,C(t)表示組件容器在t時(shí)刻的負(fù)載量,R(t)表示t時(shí)刻資源引用量,α,β,λ分別表示權(quán)重,每個(gè)節(jié)點(diǎn)將其當(dāng)前的負(fù)載情況Li(t)返回給請(qǐng)求節(jié)點(diǎn)。
4、接收客戶請(qǐng)求調(diào)用的節(jié)點(diǎn)計(jì)算t時(shí)刻的服務(wù)器群的負(fù)載總量為L(zhǎng)(t)=Σi=1nLi(t),]]>得到當(dāng)前時(shí)刻的閾值為T(t)=L(t)n,]]>經(jīng)過(guò)節(jié)點(diǎn)信息收集和負(fù)載量計(jì)算,將serverList中各個(gè)節(jié)點(diǎn)的stub按照負(fù)載優(yōu)先級(jí)排序,并通過(guò)getServerList()方法將經(jīng)過(guò)排序的serverList傳送給客戶端stub。當(dāng)前節(jié)點(diǎn)的服務(wù)器量Li(t)>T(t)時(shí)客戶端stub按照serverList順序調(diào)用服務(wù)器端集群系統(tǒng)服務(wù)器端的主要要求,就是要使得每一個(gè)服務(wù)器復(fù)本節(jié)點(diǎn)在任意時(shí)刻對(duì)于一個(gè)特定客戶端來(lái)說(shuō)都是完全相同的,也即狀態(tài)一致。根據(jù)EJB生命的周期,對(duì)一個(gè)EJB來(lái)說(shuō),它的集群系統(tǒng)服務(wù)器端有這樣3個(gè)階段1、創(chuàng)建EJB在某個(gè)節(jié)點(diǎn)上調(diào)用了創(chuàng)建方法,使得此節(jié)點(diǎn)可以接收此EJB的方法調(diào)用。那么,此時(shí)集群系統(tǒng)中的其它節(jié)點(diǎn)也需要進(jìn)行某些創(chuàng)建工作,使得它們中的任何一個(gè)都可以接收此EJB的方法調(diào)用。
2、方法調(diào)用(即一個(gè)EJB的使用過(guò)程)對(duì)于無(wú)狀態(tài)會(huì)話Bean,因?yàn)锽ean不保存狀態(tài),所以無(wú)需做什么;而對(duì)于有狀態(tài)會(huì)話Bean和實(shí)體Bean,因?yàn)锽ean保存狀態(tài),所以在每次方法調(diào)用時(shí)還需要進(jìn)行狀態(tài)復(fù)制,使得所有節(jié)點(diǎn)對(duì)于此EJB狀態(tài)一致,從而可以實(shí)現(xiàn)透明遷徙。
3、移除EJB在某個(gè)節(jié)點(diǎn)上調(diào)用了移除方法,則此節(jié)點(diǎn)此后將無(wú)法接收此EJB的方法調(diào)用請(qǐng)求。集群系統(tǒng)中的其它節(jié)點(diǎn)也要進(jìn)行移除工作,使得每一個(gè)節(jié)點(diǎn)都無(wú)法接收此EJB的方法調(diào)用請(qǐng)求。
每種類型的EJB有不同對(duì)于以上的處理有不同處理方式,服務(wù)器端的具體設(shè)計(jì),將分為有狀態(tài)會(huì)話Bean,實(shí)體Bean和無(wú)狀態(tài)會(huì)話Bean,三種Bean的服務(wù)器端實(shí)現(xiàn)基本相比,因此首先對(duì)狀態(tài)會(huì)話Bean的實(shí)施進(jìn)行詳細(xì)描述,再對(duì)實(shí)體Bean和無(wú)狀態(tài)會(huì)話Bean的特殊部分進(jìn)行補(bǔ)充。
4、狀態(tài)會(huì)話Bean(Stateful Session Bean)實(shí)現(xiàn)有狀態(tài)會(huì)話Bean的集群有幾個(gè)具體問(wèn)題要考慮首先,需要考慮復(fù)制那些狀態(tài);其次,進(jìn)行狀態(tài)復(fù)制時(shí)要在不同的節(jié)點(diǎn)間具有正確的對(duì)應(yīng)關(guān)系;同時(shí),還要考慮鈍化和激活操作對(duì)于狀態(tài)復(fù)制的影響。容器是EJB組件的運(yùn)行環(huán)境,容器初始化雖然不是一個(gè)EJB生命周期的一部分,但是在集群中也擔(dān)任了重要的工作,即將EnterpriseContextRequestMessage和EnterpriseContextReplicationWrap類實(shí)例注冊(cè)到狀態(tài)管理器,并將home實(shí)現(xiàn)類實(shí)例注冊(cè)到復(fù)制管理器以將此節(jié)點(diǎn)加入對(duì)于home stub的serverList中。
容器的創(chuàng)建過(guò)程1、創(chuàng)建過(guò)程由客戶端調(diào)用home接口中的create()方法開(kāi)始;2、經(jīng)過(guò)實(shí)例攔截器時(shí),將會(huì)為此創(chuàng)建操作關(guān)聯(lián)一個(gè)新的context實(shí)例;3、在容器類中,首先調(diào)用Bean實(shí)現(xiàn)類實(shí)例的ejbCreate()方法。然后賦給context實(shí)例一個(gè)id,為了在整個(gè)集群系統(tǒng)中具有唯一的名稱,id改為節(jié)點(diǎn)名和只增的長(zhǎng)整型值組成,這樣的id在集群系統(tǒng)中是唯一的。接下來(lái)是啟動(dòng)ejbObject實(shí)例,將其發(fā)布到rmi端口使其對(duì)于客戶端可用,同時(shí)將ejbObject注冊(cè)到復(fù)制管理器以將此節(jié)點(diǎn)加入serverList中。
4、方法調(diào)用返回實(shí)例攔截器時(shí),如果創(chuàng)建成功則將此context插入cache,并向其它節(jié)點(diǎn)發(fā)送創(chuàng)建的要求,而結(jié)果則返回客戶端。
業(yè)務(wù)方法調(diào)用過(guò)程1、業(yè)務(wù)方法的調(diào)用過(guò)程由客戶端調(diào)用Remote接口中的業(yè)務(wù)方法開(kāi)始;2、經(jīng)過(guò)實(shí)例攔截器時(shí),從cache中取出對(duì)應(yīng)id的context實(shí)例,并且在進(jìn)入下一個(gè)攔截器前,首先發(fā)送一個(gè)保持的消息。接收到這個(gè)消息的其它節(jié)點(diǎn),會(huì)鎖定其上具有同樣id值的context實(shí)例。因?yàn)榇舜畏椒ㄕ{(diào)用應(yīng)該對(duì)于所有節(jié)點(diǎn)具有同樣的影響,所以要防止其它節(jié)點(diǎn)上的同值context實(shí)例在此節(jié)點(diǎn)進(jìn)行方法調(diào)用期間被鈍化甚至被刪除。
3、在結(jié)束方法調(diào)用返回實(shí)例攔截器時(shí),無(wú)論調(diào)用成功與否都要進(jìn)行狀態(tài)同步的工作,即將context實(shí)例包裝之后發(fā)送給其它所有節(jié)點(diǎn)。
4、其它節(jié)點(diǎn)接收到狀態(tài)同步要求之后的響應(yīng)工作主要有兩方面一是本節(jié)點(diǎn)上context實(shí)例的instance引用將指向接收到的instance實(shí)例,以同步instance實(shí)例的狀態(tài)變化;二是本節(jié)點(diǎn)上的locked值置為接收到的locked值,以同步context實(shí)例的調(diào)用狀態(tài)。
5、后創(chuàng)建過(guò)程是一個(gè)特殊的創(chuàng)建過(guò)程。在一個(gè)新的節(jié)點(diǎn)加入集群系統(tǒng)后,如果它接收到一個(gè)EJB的業(yè)務(wù)方法狀態(tài)同步要求,那么因?yàn)樵诖诵鹿?jié)點(diǎn)上并沒(méi)有創(chuàng)建此EJB,因此首先要進(jìn)行后創(chuàng)建過(guò)程。
移除過(guò)程1、移除過(guò)程由客戶端調(diào)用Remote接口中的remove()方法開(kāi)始。
2、經(jīng)過(guò)實(shí)例攔截器時(shí),與一般業(yè)務(wù)方法調(diào)用相同。
3、在容器類中,首先停止ejbObject實(shí)例,使其對(duì)于客戶端不可用;然后調(diào)用ejbRemove()方法;最后將context實(shí)例的id置為null。
4、結(jié)束方法調(diào)用實(shí)例攔截器時(shí),因?yàn)閏ontext實(shí)例的id被置為null,所以此context實(shí)例將被從cache中移除。
服務(wù)器端狀態(tài)同步參見(jiàn)圖2,圖2為為兩個(gè)服務(wù)器復(fù)本節(jié)點(diǎn)組成的集群系統(tǒng),表示了在nodel上進(jìn)行方法調(diào)用以及狀態(tài)復(fù)制的完整過(guò)程。圖2中分別是前面的創(chuàng)建過(guò)程、業(yè)務(wù)方法調(diào)用過(guò)程、響應(yīng)創(chuàng)建過(guò)程和響應(yīng)業(yè)務(wù)方法狀態(tài)同步過(guò)程。
1、客戶的方法調(diào)用由節(jié)點(diǎn)1接收,方法分為兩種類型Home接口的創(chuàng)建方法和業(yè)務(wù)方法調(diào)用。
2、如果是Home接口的創(chuàng)建方法,首先在節(jié)點(diǎn)1進(jìn)行組件對(duì)象創(chuàng)建,然后進(jìn)行狀態(tài)同步方法。節(jié)點(diǎn)2接收到狀態(tài)同步方法,判斷同步方法的類型,如果是Home創(chuàng)建方法,則在節(jié)點(diǎn)2創(chuàng)建相同的對(duì)象實(shí)例,完成同步處理后,由節(jié)點(diǎn)1返回調(diào)用結(jié)果給客戶。
3、如果是業(yè)務(wù)方法調(diào)用,首先根據(jù)客戶調(diào)用方法的Id從Cache中取出對(duì)應(yīng)的對(duì)象上下文(EnterpriseContext),同時(shí)發(fā)出上下文鎖請(qǐng)求(LockingRequest),節(jié)點(diǎn)2從Cache中取出對(duì)象上下文,進(jìn)行鎖定操作(setLock),使其處于等待狀態(tài)(Wait)。然后節(jié)點(diǎn)1處理業(yè)務(wù)方法調(diào)用,完成后,進(jìn)行狀態(tài)同步。節(jié)點(diǎn)2接收到同步方法調(diào)用,進(jìn)行業(yè)務(wù)方法的同步操作,同步對(duì)象實(shí)例的狀態(tài)屬性。完成同步操作后,由節(jié)點(diǎn)1返回調(diào)用結(jié)果給客戶。
4、如果節(jié)點(diǎn)2已經(jīng)創(chuàng)建了EJB對(duì)象實(shí)例,只要同步本次業(yè)務(wù)方法調(diào)用的狀態(tài),否則首先在節(jié)點(diǎn)2進(jìn)行EJB對(duì)象實(shí)例的創(chuàng)建過(guò)程,然后和節(jié)點(diǎn)1的狀態(tài)同步。
容錯(cuò)過(guò)程1、如果客戶端調(diào)用返回正確結(jié)果,則調(diào)用完成。
2、如果客戶的調(diào)用捕捉到IOException或者為RunTineException則從ServerList中選取次輕負(fù)載節(jié)點(diǎn),繼續(xù)向其它服務(wù)器進(jìn)行業(yè)務(wù)方法調(diào)用。
3、如果ServerList中可用節(jié)點(diǎn)為空,并且沒(méi)有返回正確結(jié)果,則調(diào)用失敗。
實(shí)體Bean(Entity Bean)基本和狀態(tài)會(huì)話Bean的過(guò)程相同,不同在于一個(gè)有狀態(tài)會(huì)話Bean的生命周期是由create方法調(diào)用開(kāi)始的,而一個(gè)實(shí)體Bean的生命周期可以由create方法調(diào)用開(kāi)始,也可以由finder方法調(diào)用開(kāi)始。
finder方法又分為單數(shù)查找和復(fù)數(shù)查找過(guò)程單數(shù)查找只返回一個(gè)ejbObject實(shí)例,而復(fù)數(shù)查找返回一批ejbObject實(shí)例。單數(shù)查找過(guò)程和創(chuàng)建過(guò)程很類似,而復(fù)數(shù)查找過(guò)程則只是創(chuàng)建一批ejbObject實(shí)例并啟動(dòng),其它工作則等到具體通過(guò)某個(gè)ejbObject實(shí)例進(jìn)行方法調(diào)用時(shí)才進(jìn)行。因此,這里將create過(guò)程和單數(shù)finder過(guò)程通稱單數(shù)過(guò)程,而將復(fù)數(shù)查找過(guò)程成為復(fù)數(shù)過(guò)程。
對(duì)于單數(shù)過(guò)程和復(fù)數(shù)過(guò)程的同步響應(yīng)也不相同單數(shù)過(guò)程和有狀態(tài)會(huì)話Bean的響應(yīng)創(chuàng)建基本相同,只是并不復(fù)制instance實(shí)例,僅將valid置為false;復(fù)數(shù)過(guò)程則從ejbObjectIdList中獲得id列表,在本地創(chuàng)建這些ejbObject實(shí)例并啟動(dòng),其它工作則等到具體通過(guò)某個(gè)ejbObject實(shí)例進(jìn)行方法調(diào)用時(shí)才進(jìn)行。
業(yè)務(wù)方法調(diào)用過(guò)程可以說(shuō)與有狀態(tài)會(huì)話Bean的業(yè)務(wù)方法調(diào)用過(guò)程是相同的。唯一的不同就是不復(fù)制instance實(shí)例,只是將本地context實(shí)例的valid置為false,強(qiáng)迫它進(jìn)行方法調(diào)用之前從數(shù)據(jù)庫(kù)獲得同步無(wú)狀態(tài)會(huì)話Bean(Stateless Session Bean)無(wú)狀態(tài)會(huì)話Bean由于不持有狀態(tài),所以與前兩種Bean有著較大的區(qū)別。但是基本的設(shè)計(jì)并沒(méi)有大的差別,下面仍然只敘述不同于有狀態(tài)會(huì)話Bean的部分。
容器初始化無(wú)狀態(tài)會(huì)話Bean的容器在啟動(dòng)之后即將自身實(shí)例掛載到一個(gè)全局訪問(wèn)點(diǎn)上。這個(gè)全局訪問(wèn)點(diǎn)即靜態(tài)成員變量containerList,它持有一個(gè)節(jié)點(diǎn)上所有已經(jīng)啟動(dòng)的無(wú)狀態(tài)會(huì)話Bean容器類實(shí)例。
業(yè)務(wù)方法調(diào)用和后創(chuàng)建對(duì)于沒(méi)有狀態(tài)的無(wú)狀態(tài)會(huì)話Bean來(lái)說(shuō),是無(wú)需狀態(tài)同步的,所以在進(jìn)行業(yè)務(wù)方法調(diào)用時(shí)將不會(huì)對(duì)其它節(jié)點(diǎn)提出任何狀態(tài)同步要求。因?yàn)檫@個(gè)原因,無(wú)狀態(tài)會(huì)話Bean的后創(chuàng)建工作無(wú)法由Bean本身來(lái)主動(dòng)發(fā)起,因?yàn)锽ean完全無(wú)法知道是否有新的節(jié)點(diǎn)加入。
所以,無(wú)狀態(tài)會(huì)話Bean的后創(chuàng)建工作可以采用了一種比較曲折的方式當(dāng)集群中的節(jié)點(diǎn)感覺(jué)到有新的節(jié)點(diǎn)加入時(shí),它就會(huì)通知所有已經(jīng)在本節(jié)點(diǎn)啟動(dòng)的無(wú)狀態(tài)會(huì)話Bean容器,而相對(duì)于這些容器的Bean將在下一次業(yè)務(wù)方法調(diào)用(remove()方法除外)時(shí)向其它節(jié)點(diǎn)發(fā)出創(chuàng)建的要求。接收到創(chuàng)建要求的節(jié)點(diǎn)則檢查自身,如果已經(jīng)創(chuàng)建過(guò)了就置之不理,否則就進(jìn)行后創(chuàng)建工作。
以上對(duì)應(yīng)用服務(wù)器集群幾個(gè)關(guān)鍵實(shí)施技術(shù)進(jìn)行了詳細(xì)的說(shuō)明,并且這些實(shí)施過(guò)程在JToneCluster集群服務(wù)器中都得到了驗(yàn)證,應(yīng)用服務(wù)器只要遵循以上的技術(shù)實(shí)施方案都可以實(shí)現(xiàn)高可靠和高性能的服務(wù)器群。
權(quán)利要求
1.一種提高基于構(gòu)件軟件系統(tǒng)可靠性的方法,其特征在于1)首先由客戶通過(guò)其客戶端組件接口代理發(fā)出一個(gè)服務(wù)器調(diào)用請(qǐng)求;2)遵照EJB2.1規(guī)范的EJB組件,在其擴(kuò)展部署描述符中添加負(fù)載均衡和容錯(cuò)功能標(biāo)簽,指示EJB組件支持集群功能和默認(rèn)采用隨機(jī)分配負(fù)載均衡算法,通過(guò)預(yù)編譯器對(duì)EJB組件進(jìn)行編譯,生成相應(yīng)的EJBHome和EJBObject接口的實(shí)現(xiàn)類,并且對(duì)其生成實(shí)現(xiàn)類的Stub,使用預(yù)編譯工具改變Stub類原有遠(yuǎn)程調(diào)用的執(zhí)行邏輯,在每次業(yè)務(wù)方法調(diào)用前,請(qǐng)求服務(wù)器端的EJB組件的各個(gè)服務(wù)器的引用列表,實(shí)現(xiàn)請(qǐng)求的再分配;3)客戶的請(qǐng)求隨機(jī)由服務(wù)器群中任一服務(wù)器接收,這個(gè)服務(wù)器使用底層的服務(wù)器組通訊協(xié)議和其它服務(wù)器進(jìn)行通訊,根據(jù)EJB組件的擴(kuò)展部署描述符,客戶根據(jù)自己的需要選擇負(fù)載參數(shù),如果客戶有自己定制的負(fù)載參數(shù)和分配策略,則裝載客戶自己定制的參數(shù)和策略,然后根據(jù)裝載定制參數(shù)和策略模塊,在其它服務(wù)器上調(diào)用負(fù)載收集命令,在各個(gè)節(jié)點(diǎn)收集負(fù)載信息;如果客戶沒(méi)有定制此項(xiàng),服務(wù)器可以裝載默認(rèn)的參數(shù)和分配策略。4)定義負(fù)載參數(shù)系統(tǒng)基本運(yùn)行環(huán)境參數(shù)在基于J2EE應(yīng)用服務(wù)器中間件系統(tǒng)中,系統(tǒng)基本運(yùn)行環(huán)境參數(shù)定義為JVM的堆大小、使用內(nèi)存;組件容器組件容器包含Servlet容器和EJB容器,Servlet容器參數(shù)包含Servlet運(yùn)行數(shù)量和用戶單位事件請(qǐng)求數(shù)量,EJB容器參數(shù)包括分別為SessionBean組件、EentityBean組件和MessageDriverBean組件而建立的其創(chuàng)建組件數(shù)量、運(yùn)行組件數(shù)量、池態(tài)組件數(shù)量;其它引用的資源按照其類別分為數(shù)據(jù)源資源、JCA資源、JMS資源,定義其連接數(shù)量參數(shù)、可用連接數(shù)量資源和等待引用資源數(shù)量;5)根據(jù)以上的負(fù)載參數(shù)定義,動(dòng)態(tài)計(jì)算當(dāng)前時(shí)刻的服務(wù)器負(fù)載量Lt(t)=αB(t)+βC(t)+λR(t),B(t)表示在時(shí)刻t系統(tǒng)基本運(yùn)行環(huán)境負(fù)載量,C(t)表示組件容器在t時(shí)刻的負(fù)載量,R(t)表示t時(shí)刻資源引用量,α,β,λ分別表示權(quán)重,則t時(shí)刻的服務(wù)器群的負(fù)載總量為L(zhǎng)(t)=Σt=1nLi(t),]]>當(dāng)前時(shí)刻的閾值為T(t)=L(t)n,]]>當(dāng)Li(t)>T(t)時(shí),請(qǐng)求被重定向到一個(gè)輕載服務(wù)器上運(yùn)行;6)根據(jù)各個(gè)節(jié)點(diǎn)收集的負(fù)載信息,將整個(gè)服務(wù)器各個(gè)節(jié)點(diǎn)負(fù)載信息進(jìn)行加權(quán)計(jì)算得出其負(fù)載值,依據(jù)此值進(jìn)行排序,返回給客戶接口代理所有可用的服務(wù)器列表;7)客戶根據(jù)返回的這個(gè)列表順序選擇節(jié)點(diǎn),將負(fù)載最輕的節(jié)點(diǎn)取出引用,并根據(jù)服務(wù)器引用發(fā)出請(qǐng)求,此時(shí)請(qǐng)求將會(huì)在輕載節(jié)點(diǎn)上進(jìn)行執(zhí)行;8)如果這個(gè)節(jié)點(diǎn)能夠正確處理請(qǐng)求,沒(méi)有異常拋出,則同步其它節(jié)點(diǎn)的狀態(tài)信息,以保證下一次請(qǐng)求調(diào)用和分配的正確性,如果調(diào)用不成功,客戶端的請(qǐng)求則返回客戶節(jié)點(diǎn)列表,根據(jù)服務(wù)器的節(jié)點(diǎn)列表選擇下一個(gè)輕載的服務(wù)器節(jié)點(diǎn),調(diào)用EJB組件的業(yè)務(wù)方法,當(dāng)節(jié)點(diǎn)列表的所有節(jié)點(diǎn)都發(fā)生故障時(shí),客戶調(diào)用將不會(huì)被正確處理。
全文摘要
一種提高基于構(gòu)件軟件系統(tǒng)可靠性的方法,此方法采用分布式負(fù)載分配策略,能夠?qū)崿F(xiàn)多個(gè)節(jié)點(diǎn)的JToneFrame應(yīng)用服務(wù)器集群在不停止服務(wù)的情況下,動(dòng)態(tài)加載、刪除集群內(nèi)的節(jié)點(diǎn);支持水平和垂直分割;對(duì)象級(jí)和方法級(jí)EJB容器負(fù)載平衡;支持無(wú)狀態(tài)會(huì)話Bean,狀態(tài)會(huì)話Bean和實(shí)體Bean的集群。不存在單點(diǎn)失效的可能性,且也不把負(fù)載分配器獨(dú)立出來(lái),而是將負(fù)載分配器作為每個(gè)節(jié)點(diǎn)的一個(gè)組件,這樣就解決了集中式的問(wèn)題,把請(qǐng)求的分配分散到各個(gè)節(jié)點(diǎn)上。
文檔編號(hào)H04L12/24GK1710865SQ20051004287
公開(kāi)日2005年12月21日 申請(qǐng)日期2005年6月30日 優(yōu)先權(quán)日2005年6月30日
發(fā)明者趙天海, 侯迪, 趙季中, 齊勇, 郗旻 申請(qǐng)人:西安交通大學(xué)
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1