專利名稱:一種多模塊健康檢測方法
技術(shù)領(lǐng)域:
本發(fā)明涉及多模塊通訊系統(tǒng),尤其涉及多模塊檢測技術(shù)。
背景技術(shù):
移動通訊系統(tǒng)中,控制面的定位業(yè)務(wù)需要GMLC實體實現(xiàn)。GMLC實體既要通過IP連接接入LCS Client,又要通過信令方式訪問核心網(wǎng)的基本網(wǎng)元,所以GMLC實體在實現(xiàn)中需要內(nèi)部劃分為IP接入模塊和信令網(wǎng)關(guān)模塊。這兩個模塊在不同的硬件上部署,通過消息中間件通訊。在業(yè)務(wù)實際運行中,考慮系統(tǒng)的穩(wěn)定性和可擴展性,這兩種模塊都需要能夠進行負載平衡,也就是說,IP接入模塊和信令網(wǎng)關(guān)模塊都需要能夠進行多模塊的部署。尤其是信令網(wǎng)關(guān),它直接和核心網(wǎng)相連,占用信令資源,如果沒有多模塊的部署,一旦控制面定位業(yè)務(wù)量較大時,會對信令網(wǎng)絡(luò)產(chǎn)生影響,進而影響其他的數(shù)據(jù)和話音業(yè)務(wù)。
每一個IP接入模塊和信令網(wǎng)關(guān)模塊都使用模塊號進行編碼,消息中間件使用模塊號路由這些消息。這些消息中間件和具體的模塊部署在同一個硬件實體上,這樣避免使用一個集中的消息網(wǎng)關(guān),也就避免了單點故障的產(chǎn)生。
這些模塊之間為了實現(xiàn)負載平衡,每一個模塊上都需要維護一個全局的模塊列表。而維護這個列表的功能必須是動態(tài)的。不論是IP接入模塊還是信令網(wǎng)關(guān)模塊中哪一個出現(xiàn)異常,都需要能夠動態(tài)的退出這個列表,也需要能夠在恢復(fù)正常后動態(tài)地重新加入列表。
現(xiàn)有技術(shù)中,所述維護模塊列表的功能是通過健康檢測消息來實現(xiàn)的?,F(xiàn)有的處理方式一般是每一方都主動向?qū)Ψ桨l(fā)送健康報告,這種現(xiàn)有的方法盡管可以實現(xiàn)維護模塊列表的功能,但是網(wǎng)絡(luò)流量加大,實現(xiàn)變得復(fù)雜。
發(fā)明內(nèi)容
本發(fā)明的目的是提出一種多模塊健康檢測方法,使用Client/Server結(jié)構(gòu)的通訊方式,只由一方發(fā)起健康檢測。
本發(fā)明采用以下技術(shù)方案,一種多模塊健康檢測方法,用于至少兩方相互通訊的模塊,所述至少兩方模塊均使用模塊號進行唯一標識,通過消息中間件通訊,該健康檢測方法包括以下步驟步驟一,首先在發(fā)起模塊中維護一個第一列表,該第一列表中的每一表項至少包括接收模塊的接收模塊號和最后響應(yīng)時間,由發(fā)起模塊定時向第一列表中的所有接收模塊發(fā)起約定的健康檢測消息,該健康檢測消息中標識發(fā)起模塊號并被消息中間件路由到接收模塊;步驟二,接收模塊維護一個第二列表,該第二列表中的每一表項至少包括發(fā)起模塊的發(fā)起模塊號和最后發(fā)送時間,當(dāng)接收模塊收到健康檢測消息時,從消息體中取出發(fā)起模塊號,若該發(fā)起模塊號在第二列表中已經(jīng)存在,就修改表項中的最后發(fā)送時間;否則增加一個表項,填寫剛接收到的健康檢測消息的消息體中攜帶的發(fā)起模塊號和最后發(fā)送時間;步驟三,接收模塊創(chuàng)建健康檢測響應(yīng)消息,消息體中填寫接收模塊號;該健康檢測響應(yīng)消息通過消息中間件被路由到發(fā)起模塊;步驟四,發(fā)起模塊收到健康檢測響應(yīng)消息后,根據(jù)消息體中的接收模塊號從第一列表中找出對應(yīng)的表項,修改其中的最后響應(yīng)時間;若在第一列表中未找到對應(yīng)的表項,則增加一個表項,填寫健康檢測響應(yīng)消息中攜帶的接收模塊號和最后響應(yīng)時間;進一步地,雙方模塊在向?qū)Ψ侥K發(fā)送非健康檢測消息或非健康檢測響應(yīng)消息時,先從本地列表即第一列表或第二列表中選取一個健康的對方模塊。
進一步地,健康模塊的判斷標準即最后響應(yīng)時間或最后發(fā)送時間與當(dāng)前時間的差值是否超過一定的閾值。
進一步地,所述發(fā)起模塊和接收模塊均包含多個實例模塊,一方模塊中的一個實例模塊可以和另一方模塊中的所有實例模塊進行通訊。
進一步地,初始時第二列表可為空。
進一步地,第一列表和/或第二列表采用先進先出隊列。
和現(xiàn)有技術(shù)相比,采用本發(fā)明方法可以提高整個系統(tǒng)的可用性,不論系統(tǒng)中的哪一個模塊出現(xiàn)異常,都不會使整個系統(tǒng)癱瘓。由于模塊列表可以動態(tài)維護,可實現(xiàn)系統(tǒng)模塊的熱插拔。具有穩(wěn)定可靠和擴展性佳的特點,很容易復(fù)用到各種需要多模塊通訊的分布式環(huán)境中。
圖1是應(yīng)用本發(fā)明的系統(tǒng)架構(gòu)示意圖;圖2是本發(fā)明實施例中發(fā)起模塊的處理流程圖;圖3是本發(fā)明實施例中接收模塊的處理流程圖;圖4是本發(fā)明實施例中取出一個可用模塊的處理流程圖。
具體實施例方式
消息中間件是對一類可以根據(jù)消息通訊雙方的標識進行消息轉(zhuǎn)發(fā)的軟件模塊,其特征在于屏蔽了消息通訊雙方的物理位置以及和具體通訊協(xié)議相關(guān)的IP地址之類的底層技術(shù),而代之以統(tǒng)一編程接口,以及消息結(jié)構(gòu)定義,統(tǒng)一的模塊號定義、消息標識等。
模塊號的定義可以使用水平分段的分配方案,也可以使用分層的有結(jié)構(gòu)的分配方案。使用水平分段的分配方案時,系統(tǒng)中每一個物理機器上只能部署一個模塊。使用分層的有結(jié)構(gòu)的分配方案時,每個物理機器上可以部署多個模塊,每個模塊的模塊號中的前綴相同,但是使用有不同的子模塊號,模塊號的前綴仍然需要全局統(tǒng)一分配,字模塊號卻可以單獨分配,但是需要在通訊時明確指定,也就是說,子模塊號盡管可以隨意指定,但是通訊的雙方都需要明確的知道這個標識。模塊號和子模塊號可以使用數(shù)字,字符串等各種表達方式,當(dāng)使用數(shù)字來表達的時候,可以根據(jù)整個系統(tǒng)中可能支持的模塊的數(shù)量決定使用多少位長的模塊號,比如,使用一個字節(jié)來表示模塊號,系統(tǒng)最多支持256個模塊,使用兩個字節(jié)來表示的時候,最多可以支持65536個模塊,依此類推。
在相互通訊的兩個模塊之間使用預(yù)先定義好的消息號來表示各種不同的消息。不同消息的消息結(jié)構(gòu)各不相同,但是都要包含一個消息號。只要指明了消息號,也就確定了消息的結(jié)構(gòu)以及處理的方式。消息號可以使用數(shù)字和字符串來表示,但是必須全局唯一。
這些消息號對于消息中間件來說是沒有意義的,發(fā)送端的消息中間件只關(guān)心消息需要發(fā)送的目的地的模塊號,以及消息的長度,接收端根據(jù)消息長度從雙方的連接中讀出消息,并且轉(zhuǎn)發(fā)給目的模塊。
健康檢測消息就是具有特殊消息號的消息,其結(jié)構(gòu)中只要包含消息號和發(fā)出消息的模塊號這兩個字段就夠了。健康檢測響應(yīng)消息同樣有自己的消息號,其結(jié)構(gòu)也至少包括兩個字段一是消息號,一是返回響應(yīng)的模塊的模塊號。
下面結(jié)合附圖對技術(shù)方案的實施作進一步的詳細描述。
圖1是應(yīng)用本發(fā)明的系統(tǒng)架構(gòu)示意圖,從圖1中可以看出,在整個系統(tǒng)中有兩類模塊,一類為檢測消息發(fā)送模塊即發(fā)起模塊,一類為檢測消息響應(yīng)模塊即接收模塊。發(fā)起模塊和接收模塊之間都通過消息中間件相互通訊。由于沒有使用單一的消息網(wǎng)關(guān),所以這種架構(gòu)避免了出現(xiàn)單點故障。所有的模塊都使用模塊號做唯一標識。它們在發(fā)送消息時,不再依賴于底層的通訊協(xié)議所使用的標識,不需要配置IP地址等參數(shù),只要確定對方的模塊號就可以向?qū)Ψ桨l(fā)送消息。這種方式隔離了底層的通訊實現(xiàn)技術(shù),具有更大的靈活性。
系統(tǒng)中不僅有兩類模塊,而且這兩類模塊都分別有多個實例,某一類模塊中的一個實例模塊可以和另一類模塊中的所有實例模塊進行通訊,對于這個實例模塊來說,就實現(xiàn)了分布式的負載均衡。
在使用了模塊號作為唯一標識之后,對系統(tǒng)中的每一個模塊而言,實現(xiàn)這種負載均衡,就是在運行時能夠向某一個模塊號發(fā)送消息,而且保證這個模塊是可用的,并且所有的可用模塊在一種均衡策略算法的支持下能夠被遍歷到。最簡單的遍歷策略就是輪詢的方式。本發(fā)明實施例就使用輪詢的實現(xiàn)方式。其實,對于本發(fā)明健康檢測方法來說,選取何種遍歷模塊的方式并不重要,只是在討論健康檢測的結(jié)果對選取模塊的影響時,需要使用一種具體的遍歷方式加以說明而已,對于其它遍歷方式,本發(fā)明健康檢測方法仍然有效。
本實施例假設(shè)檢測消息發(fā)送方模塊即發(fā)起模塊和檢測消息接收方模塊即接收模塊都使用輪詢的方式來選取模塊,模塊中保存模塊列表的方式是采用先進先出隊列FIFO。
如圖2所示,描述了發(fā)起模塊如何通過健康檢測來維護發(fā)起模塊中的列表即第一列表。
初始時,在發(fā)起模塊的先進先出隊列即第一列表中保存每一個接收模塊對應(yīng)的表項,表項至少包含兩個字段,一是接收模塊號,一是時間戳,即檢測消息的響應(yīng)時間,初始時這個時間就是消息發(fā)出的時間,以確保此時這個模塊被判斷為可用。
發(fā)起模塊使用一個定時器以周期性的向每一個接收模塊發(fā)送健康檢測消息。
發(fā)起模塊在向接收模塊發(fā)送健康檢測消息之前,先從第一列表中取出所有的接收模塊號。該操作要求一次性地將第一列表中的所有元素拷貝一份,然后將拷貝之后的表項中的每一個模塊號取出,存放到一個新的數(shù)組中去。由于這個結(jié)果對順序并不關(guān)注,所以整個過程中不需要特別的加鎖。
發(fā)起模塊取出所有接收模塊號之后,為每一個模塊組裝一個檢測消息,實際上這些檢測消息的格式相當(dāng)簡單,因為其中只包含了發(fā)起模塊的模塊號。這樣做的原因,一方面是在輪詢的方式下這樣已經(jīng)足夠了,而且這樣可以最大限度的減少檢測消息的大小,從而減少對網(wǎng)絡(luò)通訊的影響,盡量提高整個系統(tǒng)的效率。
上述檢測消息實際上是發(fā)往消息中間件,所以只要額外指明消息的目的地的模塊號就可以,而消息的路由工作將由消息中間件來完成。即使是由于消息中間件之間的某種原因?qū)е孪⒉荒芩瓦_,而不是對方模塊出現(xiàn)故障,在本實施例的健康檢測的機制下,模塊列表的維護的功能仍然可以實現(xiàn)。
對于發(fā)起模塊來說,檢測消息的發(fā)送是周期性的進行的,一旦定時器到時,上述步驟都會重新執(zhí)行一遍。
下面再結(jié)合圖3來說明檢測消息的響應(yīng)方模塊即接收模塊如何通過健康檢測來維護它們本地的模塊列表即第二列表。
首先,接收模塊也要準備一個先進先出的隊列即第二列表,初始時第二列表可以為空。一旦一個檢測消息到達,接收模塊先從消息中取出發(fā)起模塊號,并根據(jù)該發(fā)起模塊號到隊列中進行查找。
查找的過程實際上也是一個遍歷的過程,首先是將整個先進先出隊列中的所有表項加以拷貝,并對拷貝后的數(shù)組循環(huán)操作,第二列表表項中定義的字段和第一列表表項的定義相似,同樣是保存對方的模塊號和時間戳,只是這里的時間戳是最后一次收到檢測消息的時間。判斷工作就是比較每一個表項中的模塊號和收到的檢測消息中取出的模塊號是否相等。這里的操作是首先將所有的表項加以拷貝,所以將這一步實現(xiàn)為原子操作就可以避免對隊列順序的影響。
如果找到了對應(yīng)的表項,那么檢測消息響應(yīng)方模塊就刷新表項中的時間戳,否則就新增一個表項,其中的模塊號填寫為收到的檢測消息中取出的模塊號,時間戳填寫為當(dāng)前時間,并將這個表項加入到先進先出隊列即第二列表的尾部。
接著,接收模塊為這條檢測消息組裝響應(yīng)消息,響應(yīng)消息的結(jié)構(gòu)同樣只需要包含模塊號就夠了。這里的模塊號填寫為響應(yīng)方的模塊號即接收模塊號。響應(yīng)方即接收模塊同樣向消息中間件發(fā)送這條消息,并且只需要額外指明消息接收方的模塊號就可以,具體的路由工作由消息中間件來完成。
再重新回到圖2來說明檢測消息發(fā)送方即發(fā)起模塊收到健康檢測響應(yīng)消息之后的操作。
發(fā)起模塊收到健康檢測響應(yīng)消息之后,和接收模塊收到健康檢測消息的處理方式完全類似,首先取出消息中包含的接收模塊號,在第一隊列中進行查找,如果找到對應(yīng)表項的話,就刷行該表項的時間戳,否則,在列表中新增一個表項,其中的模塊號填寫為收到的響應(yīng)消息中攜帶的接收模塊號,時間戳填寫為當(dāng)前時間。
查找的方法前面已經(jīng)說明,不再贅述。
接下來,再結(jié)合圖4說明每一個模塊如何利用本地模塊列表即第一列表或第二列表來實現(xiàn)分布式負載均衡的。同時說明,如何在選取模塊時保證已失效的模塊不再被選中。
當(dāng)某一個模塊要向另一方模塊發(fā)送非健康檢測消息時,它首先要從本地模塊列表中選取一個對方模塊。當(dāng)然選取的標準是要求對方模塊是處于激活狀態(tài)的。由于前面的健康檢測過程中記錄了每次收到對方模塊檢測或者應(yīng)答消息的時間,那么可以通過這個時間和當(dāng)前時間的差是否超過一定閾值來判斷對方模塊是否處于激活狀態(tài)。
由于第一列表和第二列表使用的是先進先出隊列,所以操作時總是從隊列頭中取出一個表項,判斷相應(yīng)模塊的狀態(tài)后,再將它重新加入表尾。也就是說這個操作是不會破壞整個隊列的順序的。而且這里要著重說明的是,這個操作要作為一個原子操作來對待,也就是說,在整個操作開始之前,要對一個信號量加鎖,在遍歷完隊列之后,再對信號量解鎖,這樣可以保證在整個操作過程中不會被其它的線程所打斷,也就可以保證隊列順序的正確性。
在遍歷過程中,如果找到一個處于激活狀態(tài)的模塊,就可以返回這個模塊號,但是返回之前還需要將表項重新加入表尾。如果整個遍歷過程沒有找到處于激活狀態(tài)的模塊,或者說所有的模塊當(dāng)前都是不可用的,那么需要由系統(tǒng)指定一個專門的缺省模塊作為返回值,或者報告異常。
本發(fā)明實施例既涉及到模塊列表維護中模塊的動態(tài)退出的功能,又涉及到模塊的動態(tài)加入的功能。所以這是一個簡單而完善的實現(xiàn)方案,可以在此基礎(chǔ)上實現(xiàn)各種分布式負載均衡的功能。
當(dāng)然,本發(fā)明還可有其他多種實施例,在不背離本發(fā)明精神及其實質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,比如修改保存模塊隊列的數(shù)據(jù)結(jié)構(gòu)、使用不同的選取模塊的算法、修改檢測消息的格式、修改檢測時間戳的方式等等。但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護范圍。
權(quán)利要求
1.一種多模塊健康檢測方法,用于至少兩方相互通訊的模塊,所述至少兩方模塊均使用模塊號進行唯一標識,通過消息中間件通訊,該健康檢測方法包括以下步驟步驟一,首先在發(fā)起模塊中維護一個第一列表,該第一列表中的每一表項至少包括接收模塊的接收模塊號和最后響應(yīng)時間,由發(fā)起模塊定時向第一列表中的所有接收模塊發(fā)起約定的健康檢測消息,該健康檢測消息中標識發(fā)起模塊號并被消息中間件路由到接收模塊;步驟二,接收模塊維護一個第二列表,該第二列表中的每一表項至少包括發(fā)起模塊的發(fā)起模塊號和最后發(fā)送時間,當(dāng)接收模塊收到健康檢測消息時,從消息體中取出發(fā)起模塊號,若該發(fā)起模塊號在第二列表中已經(jīng)存在,就修改表項中的最后發(fā)送時間;否則增加一個表項,填寫剛接收到的健康檢測消息的消息體中攜帶的發(fā)起模塊號和最后發(fā)送時間;步驟三,接收模塊創(chuàng)建健康檢測響應(yīng)消息,消息體中填寫接收模塊號;該健康檢測響應(yīng)消息通過消息中間件被路由到發(fā)起模塊;步驟四,發(fā)起模塊收到健康檢測響應(yīng)消息后,根據(jù)消息體中的接收模塊號從第一列表中找出對應(yīng)的表項,修改其中的最后響應(yīng)時間;若在第一列表中未找到對應(yīng)的表項,則增加一個表項,填寫健康檢測響應(yīng)消息中攜帶的接收模塊號和最后響應(yīng)時間。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,雙方模塊在向?qū)Ψ侥K發(fā)送非健康檢測消息或非健康檢測響應(yīng)消息時,先從本地列表即第一列表或第二列表中選取一個健康的對方模塊。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,健康模塊的判斷標準即最后響應(yīng)時間或最后發(fā)送時間與當(dāng)前時間的差值是否超過一定的閾值。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述發(fā)起模塊和接收模塊均包含多個實例模塊,一方模塊中的一個實例模塊可以和另一方模塊中的所有實例模塊進行通訊。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,初始時第二列表可為空。
6根據(jù)權(quán)利要求1或5所述的方法,其特征在于,第一列表和/或第二列表采用先進先出隊列。
全文摘要
本發(fā)明旨在提供一種多模塊健康檢測方法,包括以下步驟在發(fā)起模塊中維護第一列表,每一表項至少包括接收模塊號和最后響應(yīng)時間,發(fā)起模塊定時向第一列表中的所有接收模塊發(fā)起約定的健康檢測消息;接收模塊維護第二列表,每一表項至少包括發(fā)起模塊號和最后發(fā)送時間;接收模塊創(chuàng)建健康檢測響應(yīng)消息,消息體中填寫接收模塊號;發(fā)起模塊收到健康檢測響應(yīng)消息后,維護第一列表。雙方模塊在向?qū)Ψ侥K發(fā)送非健康檢測消息時,先從本地列表中選取一個健康的對方模塊。本發(fā)明方法可以提高整個系統(tǒng)的可用性。
文檔編號H04Q3/00GK1956442SQ20051009502
公開日2007年5月2日 申請日期2005年10月26日 優(yōu)先權(quán)日2005年10月26日
發(fā)明者呂吉, 單良 申請人:中興通訊股份有限公司