專利名稱:一種發布/訂閱系統的動態負載平衡方法
技術領域:
本發明涉及一種基于渠道的發布/訂閱系統的動態負載平衡方法。
背景技術:
發布/訂閱系統(publish/subscribe)是一種信息交互和共享的中間件。在發布/ 訂閱系統中,主要有三個參與方,發布者以事件(event)的形式產生數據,并將事件發布到 系統中;訂閱者通過訂閱(subscription)向系統聲明它們感興趣的事件;發布/訂閱系統 將事件與系統中已收到的訂閱進行匹配,并且向訂閱了該事件的訂閱者發出事件通知。系 統的主要接口包括發布事件(publish)、添加訂閱(subscribe)、取消訂閱(unsubscribe) 和事件通知(notify)。發布/訂閱系統的基本結構如圖1所示。通過發布/訂閱系統,發 布者和訂閱者之間的交互在空間、時間和控制流上完全解耦。大規模分布式的發布/訂閱系統具有客戶/多服務器體系結構,其中的服務器也 稱為事件代理服務器(Event Broker)或者代理(Broker),這些服務器組織成為一定的拓 撲結構,如圖2所示。每個服務器都可以作為接入服務器接收訂閱者的添加訂閱消息和發 布者的發布事件消息。在發布/訂閱系統中,一個關鍵技術就是事件/訂閱路由算法,路由 算法負責將系統中的事件消息、訂閱消息、取消訂閱消息按照一定的規則從接入服務器轉 發到目的服務器。發布/訂閱系統在金融服務、新聞服務、傳感器網絡、RFID應用等多個領域有很大 的實際應用價值,普適環境下大規模多種類事件給發布/訂閱系統帶來了更多的系統效率 和自適應問題。當系統規模很大,訂閱和事件數目很多時,系統整體處理的負擔加重,同時 可能造成某些服務器負載過重,形成性能瓶頸;網絡中事件/訂閱路由消息過多,容易造成 網絡擁塞。因此,需要設計實現高效的事件/訂閱路由算法,提高系統的靈活性與可伸縮 性,滿足大數據量處理和適應負載動態變化的需求。發布/訂閱系統通常建立在一個由服務器組成的覆蓋網絡(Overlay)上,其中,服 務器通常被組織成層次結構或者平面結構,覆蓋網絡結構一般是靜態的,拓撲結構的改變 比較少,服務器之間通過底層的通信協議進行通信。在現有的一些事件/訂閱路由算法中,有一類稱為渠道路由,其中,一個渠道與 某種特定的事件類型關聯。渠道路由方法對于接收到的每一個訂閱和事件,都會計算出 相應的渠道,并將其傳遞給那些渠道進行處理。也就是說,給定一個訂閱,系統將會計算 出關于該訂閱所屬的渠道,這些渠道將負責存儲該訂閱并將滿足該訂閱的所有事件轉發 至訂閱者;給定一個事件,也會計算將返回一個這個事件所屬的渠道,該渠道負責將該事 件與系統中的訂閱匹配,并轉發給相關訂閱者。采用渠道路由,系統中的每個服務器只需 保存系統中的一部分訂閱,每一個事件到達時只訪問系統中的一部分服務器,這樣,降低 了整個網絡中需要轉發的消息數目和總的計算開銷。Meghdoot (Gupta, A.,Sahin, 0. D., Agrawal,D.,and Abbadi,A. E. Meghdoot :content_based publish/subscribe over P2P networks. InProceedings of the 5th ACM/IFIP/USENIX international Conference on
4Middleware, Toronto, Canada,18—22 October,2004. Middleware Conference, vol. 78. Springer-Verlag New York, NewYork, NY, pp.254-273.)禾口 Hermes(Pietzuch, P. R. and Bacon, J. Peer-to-peer overlay brokernetworks in an event-based middleware. In Proceedings of the 2nd international Workshop onDistributed Event-Based Systems, San Diego, California,08-08 June,2003. DEBS ' 03. ACM, New York, NY, PP. 1-8.)等系統使用了這種路由算法。對于渠道的劃分方法,主要包括兩種,分別是事件空間劃分(Event Space Partitioning, ESP)和訂閱集合劃分(Filter Set Partitioning,FSP)。在事件空間劃分方式下,系統所能處理的整個事件空間被劃分成多個互不相交 的子事件空間,這些子事件空間分配到網絡中的服務器,由它們進行管理。一個訂閱如果 與某些服務器所管理的事件空間有重疊,那么該訂閱就存放在這些服務器上;一個事件 可以看成是事件空間中的一個點,它將被轉發至所屬的唯一事件空間所在的服務器上進 行匹配。基于事件空間劃分的主要優點在于每個事件至多只會轉發到網絡中的一個服務 器,從而降低了網絡中的事件流量。它的不足在于,如果一個訂閱與多個子事件空間都有 重疊,那么它可能被傳遞到多個服務器,從而增加了系統中總的訂閱消息流量。另外,由 于一個訂閱可能存放在多個服務器中,使得訂閱的更新也變得復雜。TarkomaCTarkoma, S.Dynamiccontent-based channels :meeting in the middle. In Proceedings of the Second internationalConference on Distributed Event-Based Systems, Rome, Italy, 01-04 July, 2008. DEBS' 08,vol. 332. ACM, New York, NY, pp. 47-58.)給出 了一種基于事 件空間劃分的動態渠道路由算法。在訂閱劃分的方式下,每一個訂閱只被一個服務器管理,相似的訂閱將會被存放 在同一個服務器上。每個服務器上的訂閱集合用一個概要訂閱(Summary Subscription) 表示,不同服務器的概要訂閱可能重疊。如果一個事件被某些服務器的概要訂閱所確定的 空間包含,那么該事件將會被轉發至這些服務器上進行處理。顯然,訂閱劃分方式與事件 空間劃分方式相比降低了訂閱消息的流量,而增加了事件消息的流量。Zhang(Zhang,C., Krishnamurthy, A. ,Wang,R. Y,and Singh,J. P. Combining flexibility and scalability in apeer-to-peer publish/subscribe system. In Proceedings of the ACM/IFIP/ USENIX 2005international Conference on Middleware, Grenoble,France,01—01 November,2005. G. Alonso, Ed. Middleware Conference. Springer-Verlag New York,New York, NY, pp. 102-123.)給出了基于訂閱劃分的渠道路由算法。目前,發布/訂閱系統中的負載平衡問題現有的研究還比較少。Cheimg(AleX YeungCheung,A.K.and Jacobsen,H. Dynamic load balancing in distributed content-basedpublish/subscribe. In Proceedings of the ACM/IFIP/USENIX 2006 international Conference onMiddleware,Melbourne,Australia,01—01 November, 2006. M. Henning and M.van Steen,Eds. Middleware Conference. Springer-Verlag New York, New York, NY, pp. 141-161.) ST PADRES (Li, G. and Jacobsen, H. Composite subscriptions in content-based publish/subscribesystems. In Proceedings of the ACM/IFIP/U SENIX 2005 international Conference onMiddleware, Grenoble, France, 01-01 November,2005. G. Alonso,Ed. Middleware Conference. Springer-Verlag NewYork, New York, NY, pp. 249-269.)給出了一個負載平衡框架、負載估計算法和負載劃分算 法。我們注意到PADRES的路由方法是基于廣告的,而在現有的渠道路由研究中,系統的負 載平衡問題研究的還相對較少,例如如何衡量服務器上的負載、如何衡量每個訂閱所產生 的負載等問題仍然沒有一個明確的定義,內容空間的劃分標準以及劃分優劣的評價仍然沒 有一個統一的衡量標準。
發明內容
針對上述的現有的路由算法中存在的問題和不足,本發明的目的是提供一種發布 /訂閱系統的動態負載平衡方法,該方法采用高效的路由算法,使得網絡中的各個服務器的 處理負載均衡,同時降低事件傳遞開銷,減少事件的處理延遲。所述發布/訂閱系統包括由多個服務器組成的對等覆蓋網絡(Broker Overlay), 網絡中的各個服務器均作為接入服務器接收訂閱和事件信息(訂閱信息主要包括訂閱和 取消訂閱,事件信息主要包括發布事件),并通過全局路由表確定該信息所屬的事件渠道后 將其轉發至該事件渠道進行處理;該系統在運行過程中進行動態負載平衡,動態負載平衡 包括負載過重的服務器從本地選擇轉移負載并在其他服務器中選擇負載接收服務器,將 該轉移負載發送至該負載接收服務器。本發明涉及的發布/訂閱系統將事件空間劃分為多個子事件空間,并將其映射為 渠道,再將事件渠道劃歸到不同的服務器負責,當事件或訂閱到達服務器后,該服務器檢查 它屬于哪些渠道,然后轉發至目的渠道進行處理。在路由協議的執行過程中,系統會實時的 監測各個渠道的負載,進而監測網絡中各個服務器的負載狀況,并采用相應的負載平衡策 略調整渠道的部署,平衡各服務器之間的處理負載。原子路由協議的整體目標是使得網絡 中的各個服務器的處理負載均衡,同時降低網絡開銷,減少事件的處理延遲。該方法主要包括以下幾個方面1)網絡拓撲結構的建立。系統中的所有服務器組織成為一個覆蓋網絡,在這個覆 蓋網絡中,每個服務器都可以與其他服務器直接通信,而不管它們底層是否直接連通;各個 服務器都是對等的,都可以作為接入服務器接收訂閱者的添加訂閱消息和發布者的發布事 件消息。2)系統的初始化。將系統所能處理的所有事件組成的事件空間表示的渠道稱為全 事件渠道,在系統初始化時,選擇一個服務器作為初始化服務器,將全事件渠道放置在初始 化服務器上。初始化服務器建立本地渠道表,表中只有一項,即全事件渠道。初始化服務器 生成一個全局路由表,每個表項是渠道到服務器的映射,即 < 渠道,服務器 >,表示渠道的放 置位置。初始化的全局路由表只有一項,即 < 全事件空間渠道,初始化服務器 >,將全局路 由表包裝到一個渠道初始化消息中,傳遞至網絡中的所有其他服務器。網絡中的服務器接 收到渠道初始化消息后,在本地建立本地渠道表和全局路由表。在初始化時,除了初始化節 點,其他服務器的本地渠道表均為空。3)處理訂閱。系統初始化后,網絡中的任意一個服務器都可以作為訂閱者的接入 服務器接收訂閱消息/取消訂閱消息。某個服務器作為接入服務器接收到了從訂閱者發出 的訂閱消息/取消訂閱消息,那么該服務器首先查詢全局路由表,得到該訂閱所屬的渠道 集合,進而得到該訂閱應該在哪些服務器上處理。如果需要在本地的某些渠道進行處理,則
6在本地渠道上對訂閱消息/取消訂閱消息進行處理;如果還需要轉發至其他服務器上,那 么將該消息轉發至目的服務器,并且在轉發消息中加入該訂閱屬于的在目的服務器上的渠 道的標識。如果某個服務器接收到了從其他服務器轉發過來的訂閱消息/取消訂閱消息和 訂閱/取消訂閱屬于的本地渠道的標識,那么服務器不需要再查詢全局路由表,直接將訂 閱/取消訂閱交給本地渠道處理。4)處理事件。系統初始化后,網絡中的任意一個服務器都可以作為發布者的接入 服務器接收事件。某個服務器作為接入服務器接收到了從發布者發出的事件消息,那么該 服務器首先查詢全局路由表,得到該事件所屬的渠道(事件只可能屬于某一個事件渠道), 進而得到該事件應該在哪個服務器上處理。如果需要在本地的渠道進行處理,則在本地渠 道上對訂閱消息/取消訂閱消息進行處理;如果事件需要被在其他服務器上的渠道處理, 那么將該消息轉發至目的服務器,并且在轉發消息中加入該事件屬于的在目的服務器上的 渠道的標識。如果某個服務器接收到了從其他服務器轉發過來的事件消息和事件屬于的本地 渠道的標識,那么服務器不需要再查詢全局路由表,直接將事件交給本地渠道處理。如果有 訂閱與事件匹配了,那么將向訂閱了該事件的訂閱者發送事件通知。5)監測負載狀態。當渠道處理屬于它的事件時,會調用渠道所在服務器上的匹配 模塊,將事件與訂閱進行匹配。在事件進行匹配時,將記錄由于該事件匹配在該事件渠道上 產生的負載。服務器上的負載等于放置在該服務器上的各個渠道負載之和,所以進而可以 得到服務器上的負載。各個服務器在系統運行時會定期的向所有鄰居發送自己的負載信 息;服務器接收它的鄰居發送過來的負載信息,從而得知整個網絡的負載狀況。6)負載平衡過程。服務器在得知整個網絡的負載狀況之后,如果發現自己的負載 過重,那么將以一定的概率觸發負載平衡過程。負載過重的服務器作為負載移出服務器,從 負載較低的鄰居服務器中選擇出負載接收服務器,并在負載移出服務器的本地渠道中選擇 出可以轉移出去的渠道。在選擇負載接收服務器和負載移出渠道時,需要考慮不同的因素, 使得轉移開銷盡量小,負載平衡效果較優,并且在選擇的過程中,可能涉及渠道的分割或者 合并。在選擇出負載接收服務器和負載移出渠道后,在負載移出服務器和負載接收服務器 之間就會建立負載轉移會話,轉移渠道進而轉移負載。進一步地,上述步驟5)所述的監測負載過程具體為負載平衡算法的執行過程分成一個個時間片T,在每個時間片內監測本地負載和 其他服務器的負載,并根據自身與其他服務器的負載狀況決定是否啟動負載平衡過程。在每個時間片T內,服務器會接受其他服務器傳遞過來的負載交換消息,并且在 時間片結束的時候,根據本地服務器的負載信息,生成一個負載交換消息,發送給網絡中其 他所有服務器。服務器會根據鄰居的負載信息以及自己的負載信息計算出包括網絡中平均 負載水平等數據,分析自己的負載平衡狀態,如果發現本地服務器負載過重,那么將以一定 概率調用負載平衡算法,開始平衡過程。對于一個渠道,在匹配屬于該渠道的某個事件時,測試到的訂閱的數目(不論該 訂閱是否與事件匹配成功,只要在匹配過程中參與了測試就計算在內),稱為匹配這個事件 的開銷,在時間片T內渠道處理的所有事件的開銷之和就是渠道在時間片T內的負載,服務
7器在時間片T內的負載等于該服務器上各個事件渠道的負載之和。具體的負載檢測流程可按下列實例進行0.各個服務器在初始化時默認自己的負載狀況是低負載狀態;1.從網絡中的其他服務器接收到負載信息交換消息,得到其他服務器的負載信 息;2.對于從鄰居服務器接收到的每一個負載交換消息,根據它們是否負載過重,分 別放入兩個鏈表中保存;3.在時間片末,計算出自己的負載值。如果已經得到所有鄰居的負載消息,那么計 算出平均負載;4.根據自己的負載狀態,生成一個新的負載交換消息,將這個消息發送給網絡中 的其他服務器;5.如果當前服務器處于負載過重的狀態,那么以一定概率調用負載調度算法,平 衡服務器之間的負載;6.時間片T結束,繼續1。進一步地,負載平衡過程,即上述步驟6),分為兩個階段負載調度(選擇出負載 接收服務器和負載轉移渠道)和負載轉移。負載調度使用一組評估函數選擇出負載接收服 務器和需要轉移的渠道,在評估函數的執行過程中可能會分割/合并本地已有的渠道。負 載轉移定義了在負載移出服務器和負載接收服務器之間的通信協議,將移出渠道和相關訂 閱由負載移出服務器轉移到負載接收服務器上,完成負載平衡過程。本發明采用基于渠道的路由方法,能夠將事件的處理責任分布到網絡中的不同服 務器上,在處理訂閱和事件消息時,至多在網絡中轉發一次,即可由接入服務器轉發至目的 服務器進行處理,從而減少了網絡中的消息流量,降低網絡負載;事件在網絡中的服務器上 僅需要匹配一次,就可以得到對它感興趣的訂閱者。同時,本發明中為渠道路由算法加入了 負載平衡機制,系統一直監測整個網絡的負載狀況,在負載不平衡的情況發生時,可以啟動 負載平衡的過程,平衡服務器之間的負載。與現有的渠道路由協議相比,可以防止熱點區域 的產生,進而降低事件的處理延遲,提高事件的處理效率。
圖1是現有發布/訂閱系統的基本結構示意圖;圖2是現有的服務器拓撲結構示意圖,其中1-事件服務器,2-發布者/訂閱者;圖3是本發明的渠道路由服務器覆蓋網絡示意圖;圖4是事件空間與訂閱關系示意圖;
圖5是服務器狀態轉換示意圖。
具體實施例方式下面通過具體實施例對本發明作更為詳細的描述。本發明將系統中的服務器組織成為一個對等覆蓋網絡,在這個覆蓋網絡中,服務 器之間可以直接通信。在系統建立之初,首先任意選擇一個服務器作為初始化服務器,在這 個服務器上部署上全事件渠道,建立全局路由表,并將這個全局路由表轉發至網絡中的其他服務器;然后各個服務器可以作為接入服務器接收用戶的訂閱或者事件消息,通過查詢 全局路由表,可以得到訂閱或者事件應該被哪些服務器處理。在系統正式運行時,部署在每 個服務器上的負載平衡模塊會不斷的監測各個服務器上的負載并在服務器之間交換負載 信息,在負載不平衡的狀況發生時,開始負載平衡過程,調度負載,使得各個服務器之間的 處理負載分布均勻。[1],首先詳細介紹本發明中服務器覆蓋網絡的建立。不考慮網絡中的服務器是如 何硬件連通的,在覆蓋網絡層任意兩個服務器之間是可以連通的,每一個服務器都知道網 絡中所有服務器的IP地址。一個服務器可以通過IP地址和另外的任何一個服務器進行通 信,消息的傳輸使用TCP完成。底層的物理鏈路發生改變,不影響應用層上兩個服務器之間 的通信,只要它們之間仍有可以連接的通路。網絡拓撲結構如圖3所示,服務器之間的物理 連接使用虛線表示,當服務器A與服務器D之間的物理鏈路斷開時,A向D發送的消息可以 通過路徑A — C — E — D到達服務器D。另外,服務器上的網絡接口模塊使用MINA(Apache MINA Project. http//mina. apache, org/)網絡框架開發,負責服務器間接收/發送各種消息,包括事件消息、訂閱消 息、路由表更新消息、渠道轉移消息、負載監測消息等。網絡接口模塊包括消息接收隊列和 消息發送隊列,在接收消息隊列不為空時,系統按照消息到達的先后順序,對消息隊列中的 消息逐一進行處理;在發送隊列不為空時,系統按照進入隊列的先后順序逐一將消息發送 出去。消息接收隊列/消息發送隊列包括兩種,一種是常規消息接收/發送隊列,用于接收 /發送普通的事件、訂閱和取消訂閱消息,另外一種是高優先級隊列,用于接收/發送事件 渠道初始化消息、負載平衡相關的消息等具有高優先級的消息。在高優先級隊列不為空時, 系統總是先處理高優先級隊列中的消息,然后才是常規隊列中的消息。[2],下面詳細介紹本發明涉及的訂閱、事件和事件空間的定義以及它們之間關系 的定義。基于內容的發布/訂閱系統中的謂詞、訂閱、事件項、事件定義如下一個謂詞f 定義為一個四元組,即f = (type, attr, op, cons),其中type表示該謂詞的取值類型, attr表示屬性名稱,op表示謂詞所允許使用的操作符,cons表示該謂詞在該屬性上的約 束值。一個訂閱F是若干謂詞的合取,可以表示為F = f\ Af2 A... Afn。一個事件項 a是一個三元組,S卩a = (type,attr,value),其中type是取值類型,attr是屬性名稱, value是事件項的取值。一個事件是若干事件項的合取,所以,一個事件e可以表示為e = a \ a2/\...八 ak。對于謂詞f = (type, attr, op, cons),我們定義L (f)為f的約束值域,即在屬性 attr上滿足f的所有類型為type的值的集合。對于事件項a = {typee :attre, valj和 謂詞f = {type :attr,0p,Val},我們說事件項a滿足謂詞f,即f > a ,當且僅當type = typee A attr = attre A vale G L(f)。一個訂閱 F = 八 f2 八...A fn,事件 e = a A a2 A . . . A a k,事件 e 滿足 訂閱F,即e G F,當且僅當VfiBo^fi > a JO另外,謂詞之間、訂閱之間還存在著覆蓋關系,下面給出謂詞之間和訂閱之間覆蓋 關系的定義。對于謂詞 f1 = {type! -.attr^ op” valj 禾口謂詞 f2 = {type2 :attr2, op2, val2},如
9果滿足f2的事件項一定滿足f\,那么稱覆蓋f2,即> f2。形式化的描述為f\ > f2,當 且僅當,type1=type2Aattr1=attr2AL(f1)2L(f2)。覆蓋關系是自反的,覆蓋自身。一個訂閱F1 = f/八C八...A f;,,另一個訂閱F2 = f\2八f22八...八fn2,如果 滿足F2的事件一定滿足F1,那么稱訂閱F1覆蓋訂閱F2,S卩F^F2。形式化的描述為F2, 當且僅當,▽ fi'3 f, f/ > f/0本發明采用事件空間劃分的機制,將內容空間進行劃分,進而將劃分后 的事件空間映射為事件渠道。事件空間的表示也類似訂閱,可以表示為Es = f\八f2八…A fis A ... A fn,其中謂詞fid^i^n)表示了在某種屬性上的約束,用 于限定事件空間在該屬性維度上的范圍。如果某屬性不出現在事件空間的表達式中,表明 該屬性在該事件空間上值可以取值域中的任一個。所以,如果定義事件空間的表達式中的 謂詞數目為0,則對所有的屬性的取值都沒有限制,那么該事件空間就是全事件空間,為了 簡單起見,記為WES。事件空間Es覆蓋事件e表示為e G Es ;事件空間Es覆蓋訂閱F表示為ES = F;事 件空間Es與訂閱F有重疊表示為ESAF關0。一個事件空間Es = f\Es A f2Es A... A fnEs,事 件e= ai A a2 A... A ak,事件空間艮覆蓋事件e (或者說事件e在事件空間ES中、 事件e屬于事件空間ES),即e e Es,當且僅當f產> a」(1彡i彡n,1彡j彡k)。 事件空間Es = f\Es A f2Es A ... A fnEs和訂閱F = f\F A f/ A . . . A f;,事件空間Es覆蓋 訂閱F,即Es〕F,當且僅當V f,Es3 f/, f^3 > f/0事件空間艮=€嚴八f2Es八…AfnEs, 一個訂閱卩=(八《八...A f/,二者存在重疊關系,即EsfTF¥0 ,當且僅當 ,, f;)attr,Es = attrf a L(f,Es) (1 L(ff ) = 0(1 Q 1 W S m)。如果一個訂閱 F 被一個
事件空間Es覆蓋或者與Es有重疊關系,那么就稱訂閱F屬于事件空間Es。圖4給出了一個二維的事件空間,它被分割成了 6個子事件空間E” E2,E3,E4,E5, E6,其中訂閱 Sub!, Sub2 禾口 Sub3 屬于 E^ Sub3, Sub4, Sub5 禾口 Sub6 屬于 E2, Sub6, Sub7 禾口 Sub8 屬于E3,Sub9屬于E4,Sub1Q和Subn屬于E5,Sub1Q和Sub12屬于E6。并且在圖4中,矩形之 間的包含表示了訂閱之間的覆蓋關系,矩形之間的重疊表示了訂閱與事件空間、訂閱與訂 閱之間的重疊關系。同時也可以看出,一個訂閱可能會屬于多個事件空間。[3],下面介紹本發明中事件渠道的定義。一個事件渠道ch (Event Channel,或簡稱為渠道)包含這個渠道的事件空間Es和 屬于Es的訂閱的集合S。在事件渠道上除了保存有該渠道上的事件空間和訂閱的集合之 外,還包括采樣統計時間片內落在該渠道上的事件的集合等,這些信息都是為了后續監測 渠道上的負載和進行渠道分割等操作設置的。另外,在表示時,可以將渠道簡化表示為CH =<Es,S>這種二元組的形式。定義EC為所有事件渠道的集合,即全事件渠道。一個事件渠道被放置到唯一的服 務器上,一個服務器上可以放置有多個事件渠道。每個事件渠道都包含有一個唯一的id作 為它在網絡中的唯一標識,這個id是建立這個事件渠道的服務器賦給的(初始化時或者渠 道分割或合并時),包括服務器的標識和服務器本地的一個序列號,所以id是全局唯一的。[4],下面介紹服務器上的本地渠道表(localTable)和全局路由表 (routingTable)。
在服務器上保存著兩個表,一個表稱為本地渠道表(localTable),表項為事件 渠道,記錄著放置在這個服務器上的渠道,另外一個表稱為全局路由表(routingTable), 表項為事件渠道到服務器的映射,記錄著渠道在服務器上的放置位置。每個服務器的 localTable是各不相同的,而routingTable都是一樣的。當訂閱消息到達某一個服務器(即,接入服務器)時,接入服務器上通過查詢 routingTable得到它屬于的那些事件渠道,并將該消息轉發到相應的渠道進行處理;一個 渠道ch接收到訂閱消息后,將會把該訂閱添加至本地的訂閱管理結構中,并根據添加結 果,將訂閱保存在自己的訂閱集合S (使用哈希表實現)中。如果有事件消息到達接入服務 器時,路由模塊會判斷出該事件屬于哪個渠道,然后將該事件轉發到該渠道進行處理;渠道 接收到事件后,會將其進行匹配,并且記錄相關的匹配結果和產生的負載。在系統初始化時,在初始化服務器(initializer broker, ibrk)上部署著全事件 渠道EC,routingTable中只有一項,即<EC,ibrk>,并將這個路由表傳遞給系統中的所有服 務器。初始化完成后,系統可以接收訂閱和事件,通過查詢路由表,將其轉發給相應渠道進 行處理;并且根據服務器間交換的負載信息,移動渠道,平衡負載。[5].下面介紹在本發明中渠道路由的屬性模式的約定。在渠道路由中,對訂閱和事件有一些約束,例如,系統必須已知所需要處理的所有 屬性的集合,所有事件和訂閱的屬性都從這個集合中選取,事件中必須包含的屬性的集合 也是已知的等。對于系統所處理的事件和訂閱,規定它們的表達式要滿足一定的模式(schema), 這個模式規定了系統所處理的事件/訂閱的屬性種類和約束,包括系統中所能處理的所有 屬性的集合,事件中必須包含的屬性等。系統所使用的模式更加規范的描述為S = k2,... kv ...,AJ,其中每一個 A^l^i^n)表示了一個屬性,每一個屬性包含了屬性名稱,屬性類型和屬性值域三個方 面的信息,可以表示為Iname,type, min, max} 0每一個屬性由它們唯一確定的屬性名稱確 定,屬性的類型是系統所支持的數據類型,例如在本發明的發布/訂閱系統中支持數值、字 符串禾口 RFID 編石馬(Beihong Jin, Shuang Yu, Xinchao Zhao, Zhenyue Long, Yifeng Qian Subscribing andMatching RFID-Related Events. ICEBE 2007. pp. 41-47.)三種數據類型 等,min和max描述了該屬性的值域的取值范圍。系統中所有的參與方都遵循這個模式。系 統中使用的訂閱中出現在謂詞中的屬性集合是模式中規定的屬性集合的子集,事件可以表 示成為事件中只包含模式中的屬性的一個子集。一個事件可以不包含有模式中所列舉的所 有屬性,但是總有一些屬性是必選的,在定義系統的屬性模式時,也給出了系統中事件需要 的必選屬性和可選屬性。在本發明中給出特征屬性(Distinguishing Attributes, DA)集 合的概念,DA =出 力^,...』々』,也就是所謂的必選屬性。事件中的屬性集合必須包含 特征屬性集。并且,用于表示或劃分事件空間的屬性,也必須從DA集合中選取,這樣,可以 保證事件總是事件空間中的一個點,從而只能屬于唯一的一個事件空間,進而只能被唯一 的一個事件渠道處理。在系統初始化的時候,這個模式就已經預先在各個服務器上配置好 了。選擇劃分事件空間的屬性需要滿足下列條件首先這些屬性是從DA集合中選取 的,而且,可以給這些候選屬性設定優先級,選取劃分事件空間的屬性時更傾向于使用數值
11類型,然后是RFID編碼類型,最后才是字符串型。同時,給出了一個特征屬性attr的流行 度的概念:
屬性的流行度用于定乂問種類型的 特征屬性的優先級,一個屬性的流行度值越大,說明關注這個屬性的訂閱越多,那么它的優 先級就越高,在劃分事件空間時就越傾向于選取它。[6],下面,給出在本發明的路由算法中動態負載平衡的問題定義。假設在系統中包含有n個服務器,渠道總數是m(m的值是可以根據渠道分割或者 合并的結果動態變化的)。令gi表示一個服務器,假設在服務器gi上有mi個 事件渠道。令chik表示在服務器上gi的第k渠道,1≤i≤n并且1≤k≤mp渠道chik 的負載是dik,Ci是gi的處理能力。gi的處理能力可通過測試服務器的處理能力給出。
定義dCi 作為一個服務的負載水平(Load Leve 1
令
是網絡中n個服務器負載水平的平均值,即
的值是所有服務器的負載水平的標準差。使用一個參數S去衡量不同的負載轉移策略的效果,
希望S的值在渠道轉移之后變小。 假如一個渠道要從服務器gi轉移到gj,那么轉移開銷mig_COst {chik — gj}可以定 義為
其中mig_ChSiZeikj(Chik)是需要轉移的渠道的大小,可以用需要轉
移出去的訂閱數目衡量它,bWiJ是服務器gi與gj之間的網絡帶寬。在網絡中包含n個服務器、m個渠道的情況下,希望能夠找到一種使得5和mig_ cost的值最低的轉移策略。服務器負載過重和負載過輕的定義如下如果dCi<dc-△d,那么負載過輕,它的負 載狀態即為UNDERLOADED ;如果dCi>dc+△d,那么負載過重,負載狀態為OVERLOADED。A d是 一個根據應用或經驗設定的值。如果一個服務器的負載非常接近忑并且通過移動渠道不能到達更好的狀態,那么 它為負載平衡狀態,即STABLE,它的負載水平滿足
如果服務器處于負 載平衡狀態,那么負載調度算法將不會被調用。可以定義
其中S e (0,1),S在 實際使用時可以選取0.1,作為Ad的一個參考值。如果一個服務器的負載狀態為OVERLOADED,即負載過重狀態,負載調度算法則可 能被調用。當負載調度算法執行時,調度算法中各個參與方的狀態設置為BUSY,表明它正處 在負載調度算法執行過程中。圖5給出了服務器的狀態轉換圖。[7],下面介紹在本發明中對渠道上以及服務器上的負載的估算。定義在采樣統計時間片T內服務器brk上的負載等于該服務器上各個事件渠道的 負載之和 系統將一直監測各個事件渠道上的負載,記錄每個采樣統計時間片T內的負載。
一個事件渠道ch上的負載計算公式定義為 sub6表示服務器在匹配一個事件e時測試到的訂閱的數目(不論e是否匹配該訂 閱,只要在匹配過程中測試了的訂閱就計算在內;原子訂閱匹配模塊只會測試屬于渠道ch 的訂閱,不屬于ch的訂閱都已經被過濾,不會被測試),用這個數值表示匹配該事件所需要 的資源開銷。采用將訂閱匹配的開銷與訂閱數目聯系起來的負載定義方式的好處是,在劃 分出去事件空間的時候,可以通過觀察劃分出去某一部分事件空間可以使多少訂閱劃分出 去,得到對負載移出服務器和負載接收服務器上負載的影響。[8],下面介紹本發明中的負載系統的平衡算法。負載平衡算法的執行過程分成一個個時間片T(即前面提到的采樣統計時間片), 在每個時間片內監測本地負載和其他服務器的負載,并根據自身與其他服務器的負載狀況 決定是否啟動負載平衡過程。服務器在每個時間片T內都交換負載信息,根據這些信息,可以在發生負載過重 或者負載不平衡的時候觸發負載調度算法,平衡負載。服務器之間交換的消息稱為負載信息交換消息(Load Information Exchange Message, LIEM)。一個LIEM消息包含4個屬性(1)服務器的唯一標識,(2)該服務器負載 平衡的狀態,可以是UNDERLOADED,STABLE, OVERLOADED,或者BUSY,(3)該服務器的負載水 平dc, (4)該服務器的處理能力c。在每個時間片T內,服務器會接受其他服務器傳遞過來的LIEM消息,并且在時間 片結束的時候,根據本地服務器的負載信息,生成一個LIEM消息,發送給網絡中其他所有 服務器。服務器會根據鄰居的負載信息以及自己的負載信息計算出包括網絡中平均負載水 平等數據,分析自己的負載平衡狀態,如果發現本地服務器負載過重,那么將以一定概率調 用負載平衡算法,開始平衡過程。[9],下面給出動態負載平衡算法的流程描述。0.各個服務器在初始化時默認自己的負載狀況是UNDERLOADED ;1.從網絡中的其他服務器接收到負載信息交換消息LIEM,得到其他服務器的負 載信息;2.對于接收到的每一個LIEM (發送者為gj),如果gj的狀態是UNDERLOADED,那 么就把它加入到鏈表uNodeList (如果gj已經保存在oNodeList之中,那么需要先把它從 oNodeList中刪除),如果狀態是OVERLOADED,那么把它加入到鏈表oNodeList中(同樣,如 果已經保存在uNodeList中,需要先把它從uNodeList中刪除),這兩個數據結構將在負載 調度算法中用到;3.在時間片末,計算出自己的dc值。如果已經得到所有鄰居的負載消息, 那么計算出平均負載忑,并根據前面給出的服務器狀態定義,更新自己的負載狀態為 UNDERLOADED/OVERLOADED/STABLE ;4.生成一個新的負載交換消息,將這個消息發送給網絡中的其他服務器;5.如果當前服務器處于OVERLOADED的狀況,那么以一定概率調用負載調度算法, 開始負載調度過程,平衡服務器之間的負載;
6.時間片T結束,繼續1。對于時間片T的選擇,有這樣的考慮如果時間片太短,那么在較短的時間內我們 將不能得到正確的事件分布信息,從而不能得到正確的負載分布信息,這樣得出的結果往 往會造成系統負載轉移的抖動,在具體選擇T的初始值時,需要考慮系統所在的應用場景, 對事件流的模式變化周期有一個估計值,并根據此估計值設置T的初始值。如果在負載平 衡算法當中發現負載調度算法非常頻繁的執行(例如連續多次檢測到在每兩個時間片T內 就會調用一次負載調度算法),那么系統就需要自動的將T適當延長(例如延長至原值的 150%),以能夠得到更加準確的事件流信息,防止抖動的發生。并且,在本地服務器發現自 己是OVERLOADED狀態時,并不會立刻啟動負載調度算法,而是以一定的概率調用負載調度 算法(例如在實現時以50%的概率調用),以防止抖動的發生。另外,服務器gi在得到網絡中的某個服務器g^的LIEM消息之后,更新本地的 uNodeList和oNodeList兩個數據結構時,可以不參看它們的負載狀態,而是將g」的負載水 平dCj與自己的dCi比較,如果dCi大于dCj,那么就將gj放置在uNodeList中,如果dCi小 于dCj,則把gj放置在oNodeList中,以取得更好的負載平衡效果。[10].下面介紹本發明中的負載調度算法,該算法首先使用一組評估函數選擇出 負載接收服務器和需要轉移的渠道,在評估函數的執行過程中可能會分割/合并本地已有 的渠道。然后將選擇出的渠道轉移到負載接收服務器上,完成負載平衡過程。下面的內容 分別介紹了負載評估函數、渠道分割/合并的策略和調度算法。首先介紹負載調度算法中的負載評估函數。在發生負載不平衡時進行負載調度,需要確定哪些渠道可以被轉移、被轉移到哪 些服務器上。在渠道轉移的過程中,還存在著轉移開銷,包括從負載移出服務器上選擇出要 轉移的渠道、將渠道及其訂閱轉移至負載接收服務器上、在負載接收服務器上添加訂閱、最 后將由于渠道轉移而將不再需要的訂閱從負載移出服務器上刪除等過程的開銷。網絡中服 務器的處理能力可能是不相同的,那么把一個渠道從一個服務器轉移到另外一個服務器, 即使渠道負載是一樣的,但對不同的負載接收服務器,造成的負載改變是不同的。為了將前面提到的各種因素都考慮進去,并比較不同因素的影響,定義了分級函 數(leveling function),lev(x)=「x.Z"|/i,其中 x G
,并且「]是取整操作符,L 是層 次的數目,是可以根據需要作出改變的值。這個分級函數可以將x劃分到L個層次中。評估函數包括四個,f\ f4,用于找到較好的將負載(渠道)從負載較重的服務器 上轉移出去的策略。其中,用于評價選擇不同的本地渠道作為轉移渠道對負載平衡的影 響;f2用于評價選擇不同的服務器作為負載接收服務器對負載平衡的影響;f3用于評價在 已經選擇出某個負載接收服務器時,選擇不同的轉移渠道對負載轉移開銷的大小;f4用于 評價在已經選擇出某個負載接收服務器時,選擇不同的轉移渠道對訂閱靠近事件源放置的 影響。負載轉移策略的確定分為兩個步驟(1)利用&和&選定接收負載的服務器;(2) 利用f\,f3和f4選定合適的轉移出去的渠道。下面介紹&的推導。為了評估在負載過重的服務器gi上的某個渠道chik(l ^ k ^ m,)轉移到某個已經 確定的接收負載的目的服務器gj的效果,定義了第一個評估函數f\(gi,gj, chik),用于評價選擇不同的本地渠道作為轉移渠道,對負載平衡的影響。&由以下過程推理得出如果要比較8值在chik轉移之前和之后的變化,我們只需要保證 并且希望 的值最小,其中x是轉移出去的渠道上的負載。解(1)式得到識
,從而得至IJ, 另外,由 所以如果將一個渠道chik轉移出去之后,如果dik在(0,2(p)之間,那么S的值在轉 移之后會變小。而且,選擇出需要轉移的渠道時,我們盡量選擇那些dik最接近cp的值,這樣 能夠取得更好的負載平衡效果。所以我們定義 其中, 這樣,我們就可以對&上的每一個渠道給出一個等級(rank)值,通過這個rank值 測定把它們轉移出去的優劣。但是,如果負載過重的服務器上找不到任何渠道chik,滿足dlke (0,2cp),那么必須要 對渠道進行分割,然后再選擇。例如系統在初始化時,只有唯一的一個渠道chn,并且部署 在該初始化服務器&上,那么屯=dn,dCi = dn/Ci,忑=dCi/n。如果已經選擇出來某個服務
器&作為接收負載的服務器,那么解(1)式之后得到
更
加特殊的,假設每個服務器的處理能力都是相同的C,則X < di = dn,那么就必須要對已有 的渠道進行分割,將分割后的渠道劃分出去。這時,我們將選擇服務器上負載最大的那個渠 道,然后將其分割成兩個部分,使得分割出的那一部分負載最接近cp。上面給出的是需要對
渠道進行分割的一種情況,另外,假如在gi上存在k個渠道,滿足
,即這些渠道的負載之和與cp的差別小于某個限定值£ (實現時£可選取為0.1* (P),那么可以將這些渠道合并,成為一個新的渠道,轉移出去。下面介紹&的推導。為了從負載較輕的服務器中,選擇出合適的服務器作為接收負載的服務器 gj(j辛i),根據服務器上的負載和處理能力,定義了 f2(gi,g」,chik),其中上的一 個渠道。f2 根據非合作博弈論(Non-Cooperative Game Theory, John Nash. Equilibrium points in n-persongames. Proc. of the National Academy of Sciences, 36, pp. 48—49, 1950.)得到,用于評估選擇不同的服務器作為負載接收服務器的好壞。如果某個服務器總 是選擇負載最輕的服務器最為負載接收服務器,那么不同的服務器之間很容易會產生選擇 沖突,而且,可能會導致更加不平衡的狀況產生。因此,每一個負載過重的服務器需要根據 它的負載需求來選擇接收負載的目標服務器。對于負載較重的服務器,在本發明中為它們 定義了 rank。值,對于負載較輕的服務器,我們定義了 ranku值,rank。和ranku值的定義如 下 其中Max (dc0-dik/c0)是所有負載較重的服務器中dc-d^/c,值最大的那個, Min(dcu-dik/cu)是所有負載較輕的服務器中(!…+知/…值最小的那個。一個負載過重的服務器,它評測得到的級別為rank。,它更愿意選擇那些負載級別 接近ranku的節點作為負載接收服務器,所以f2定義如下 其中, 下面介紹f3的推導。
根據渠道轉移開銷
,轉移渠道的開銷與
轉移出去的渠道的大小以及兩個相關服務器之間的帶寬相關,由此定義出f3(gi,gj, chik)。 首先,從gj上的mi個渠道中和所有的負載較輕的服務器中選擇出最小的負載轉移開銷
;然后,將可能從gi轉移到g^上的渠道chik的轉移開銷與最低的轉移開銷進行對比,得到評估結果。是gi和gj之間的帶寬,bwi max表示gj到所有負載較 低服務器的帶寬中的最大值。mig_chsize(chik)是轉移出去渠道的大小,使用需要轉移出去的訂閱的數目來衡 量,f3定義如下 其中,
CN 101854299 A
說明書14/23頁
.,, mig chsize(chlk)mi§-cost{chlk=--—下面介紹&的推導。由于原子路由同時也為復合路由(Peter R. Pietzuch, Brian Shand, and Jean Bacon. Composite Event Detection as a Generic Middleware Extension. IEEE Network Magazine, Special Issue on Middleware Technologies for Future Communication Networks,18(1),pp. 44-55,January/February, 2004.)提供支持,希望盡量使事件的檢測 結構的放置靠近事件發布者,那么需要考慮將渠道放置在靠近事件發布者的服務器上,將 事件渠道放置在接近事件的發布者的接入服務器上。在gi上的每一個事件渠道chik上,保存了采樣統計時間片T內到達渠道的事件數 目nik,另外還設置了一個數組,保存了這些事件中分別由網絡中的哪個服務器轉發過來的 數目,例如,由服務器g^轉發過來事件的數目記為niW,如果當前服務器本身就是事件的接 入服務器,那么也相應記為niki。在渠道路由策略下,事件由接入服務器進入系統,至多被轉 發一次就可以到達目的渠道進行處理,那么我們可以記錄服務器gj作為事件的接入服務器 的概率為acc_rateikj = nikj/nik。所以f4定義如下
綜上,四個評估函數 f4定義如下 [11].在使用上面的評估函數選擇負載接收服務器和轉移出去的渠道過程中,可能會涉及到渠道的分割/合并,所以下面介紹事件渠道的分割/合并策略。首先介紹如何分割事件渠道。已知特征屬性集合DA= {DAi,DA2,...,DAm},一個事件渠道ch = <Es,S>,其中ES =fDA1 A fDA2 A ... A fDAk,1彡k彡m是事件空間;fDAi (1彡i彡k)是在某個特征屬性上 的約束。另外已知該事件渠道上的負載LD,需要劃分出去的負載為ALD。需要選取出屬性 作為劃分屬性,將渠道分割,并且分割出來的兩個新的渠道,其中之一的負載等于ALD。首先,我們需要從特征屬性中選取出作為劃分屬性的屬性。對特征屬性集合中的 屬性首先按照類型、流行度進行排序,得到特征屬性的優先級順序,然后試圖從優先級最高 的屬性開始,選擇它作為劃分屬性對渠道進行劃分;如果選擇出來的屬性不合適劃分,那么 將會選擇優先級排序結果中的下一個屬性,作為劃分屬性,繼續進行劃分,直到找到合適的 劃分方式。對于數值和RFID編碼類型的屬性,由于它們的謂詞都可以表示成為一個區間的 形式,所以,可以將它們原來的值域劃分為連續的區域。而對于字符串類型,尤其是引入了 取前綴,取后綴,取子串等復雜的字符串操作符之后(Beihong Jin,Xinchao Zhao,Zhenyue Long, Fengliang Qi, Shuang Yu, Effective and Efficient Event Dissemination for RFID Applications, The Computer Journal, doi 10. 1093/comjnl/bxn063),很難找至lj—— 種很好的劃分字符串的方式,目前采取的方式是劃分字符串集合。如果某個屬性DAste= {name, type, valDomain}是字符串類型的屬性,需要劃分的 渠道中的事件空間表示為Es,采用DAste作為劃分屬性時的具體規則如下如果DAste還沒有加入到事件空間的表達式中,即“,那么統計 包含落在所在事件渠道上的事件在該屬性上的值,得到一個值的集合valSet,然后如果需 要使用該屬性進行劃分,那么將這個集合進行分割,例如分成valSetl和valSet2。valSetl 部分作為分割出去的事件空間在該屬性上的字符串約束,稱為類型1的字符串約束;另外 一個渠道在該屬性上的約束該屬性上的約束為valDomain/valSetl,稱為類型2的字符串 約束,記錄為{valSet2,valD0main/ValSetl}。并且如果有新到來的事件包含DAste屬性,那 么就把新的值加入到valSet2中,以備以后劃分使用。如果DAste已經是事件空間表達式中的一個屬性,并且是類型1的約束,那么就 直接把集合分割就可以了,分割出來的屬性都是類型1的字符串約束;如果是類型2的 約束,表示為{valSet2,valDomain/ValSetl},那么就從valSet2中分割出來新的集合 valSet3和valSet4,其中valSet3作為一個新的渠道在該屬性上的約束,當然該約束是屬 于類型1的字符串約束,另外一個渠道在該屬性上的約束就表示為{valSetl valDomain/ (ValSetl U valSet3)},同樣是類型2的字符串約束,并且如果有新到來的事件包含 性,那么就把新的值加入到valSet4中,以備以后再次劃分使用。有了前面給出的特征屬性的優先級的定義,下面我們說明如何使用這些特征屬性 劃分事件空間。假如特征屬性按照優先級排列為DA = {DAp DA2,DAJ,那么在每個采 樣統計時間片T內,每個渠道都對落入這個渠道的事件給出一個記錄<ei,nunii〉,并將所有 的事件記錄保存到一個隊列中。事件記錄在這個隊列中是有順序的,排在最前面的是在按 照落入這個渠道的在屬性上值最小的那個事件,如果兩個事件在上值相同,那么就 按照下一個屬性DA2上的值的大小關系排序,如果仍舊相同則采用下一個屬性上的值進行
18比較,以此規則,使得所有的事件有序記錄在隊列中。對數值和RFID編碼類型的屬性,只需 要比較它們的值的大小就可以了 ;對于字符串類型的屬性,我們就根據它們字符串值的大 小進行排序。numi記錄了事件ei在事件空間上產生的負載。假如這個事件隊列為{<ei,numi>, <e2,num2>, <en,numn>},那么可以知道,渠道
ch上的總負載LD。h = E nmv如果需要劃分出去的負載為A LD,并且|| <。
i=\
那么前k個事件就是我們需要劃分出去的那些,它們在DA = {DAp DA2,. . .,DAJ上的屬性 約束構成的子空間就是我們要劃分出去的空間的大小。而且,我們可以從DA選擇出來劃分 屬性如果前k個事件是需要劃分出去的那些,我們找到一個值j,滿足1 <= j < = m,并 且對于任何i,i < j,事件ek與ek+1在第i個屬性上的值相等,在第j個屬性上的值不相等。 那么選擇SDA= {DA1,...,DAJ}這個集合作為劃分屬性。如果劃分屬性是數值或者RFID編 碼數據類型,直接根據ek在這個屬性上的數值分割事件渠道;如果劃分屬性是字符串類型, 那么就將e2,...,ek事件在這個屬性上的值放入一個集合strSet,然后根據這個集合劃 分事件渠道,具體操作為,對于strSet中的每一個字符串str,如果事件渠道上在這個屬性 上的約束(也表示成了一個字符串集合valSet)包含了 str,那么就將str從valSet中刪 除,并且把str加入到分割出的新事件渠道的約束集合valSet’中。下面我們給出一個分割渠道的例子,DA = {a, b},并且a的優先級比b的高,渠道 表示為ch = {a G
,b G [50,80]},T時間內落在該事件渠道上的事件記錄如下<ei={a =10,b=50},3>
<e2={a =15,b=50},1>
<e3={a =20,b=60},5>
<e4={a =20,b=60},5>
<e5={a =40,b=65},2>
<e6={a =50,b=65},4>
<e7={a =70,b=70},2>
<e8={a =90,b=80},6>那么可以得到在T時間內渠道上的負載為LD = 28,如果要劃分出的負載為A LD
=14。由于=14,所以,將前四個事件(ei,e2, e3, e4)作為新的事件空間中的屬性,
而且在這個例子中,只需要劃分屬性a的值域就可以了,可以把ch分割成為兩個渠道eh = {a G
,bG [50,80]}和 ch2 = {a G [21,100],b G [50,80]}。在這個例子當中,如 果<e5 = {a = 20,b = 65,2>,那么我們除了使用a屬性之外,還需要使用b值進行劃分;在 更加特殊的情況下,如果所有的事件在屬性a上的值都相等,那么我們就選擇b屬性作為唯 一的劃分屬性。另外還有可能出現的極端情況是,假如到來的事件都是同一個事件,那么無法選 擇任何屬性作為渠道分割的屬性,并且無論怎樣分割渠道都不可能平衡負載。在這個事件 分布非常極端的情況下,可以采取渠道復制的方式,將整個渠道復制到其他的服務器上去, 并且標記為該渠道已經被復制和復制的目標服務器;在新的事件到達時,使用一個隨機函 數隨機選擇一個服務器作為服務器,通過這種方式進行負載平衡。
下面介紹如何合并事件渠道。如果已知特征屬性結合DA = {DA:, DA2,... , DAJ,也根據渠道中的事件空的各個 特征屬性的值進行排序。對于數值和RFID編碼類型屬性,可以按照區間范圍的低值進行 排序,對于字符串類型,由于它的表示方式是集合類型,所以可以不管它的順序,默認類型1 的字符串約束優先級高于類型2的。如果在系統運行時,發現服務器上的某個渠道ch在連 續n個時間片內的負載值都小于某一個限定的值,那么我們就可以將它與在排序中的鄰居 渠道進行合并;如果在負載轉移過程中,需要從服務器上轉移出去多個渠道,也可以將這些 需要轉移出去的渠道進行合并。例如兩個相鄰的事件渠道的事件空間Esl = {a G [10,20]},Es2 = {a G [21,50]} 可以合并成一個新的渠道,它的事件空間表示為Es= {aG [10,50]} 0對于字符串類型,可 以看做是集合的合并。在本發明中規定事件空間只能劃分為連續的區域,所以如果在試圖合并兩個渠道 的事件空間時,如果合并出來的區域并不連續,那么就不能合并這兩個渠道,例如如果Es2 ={a g [30,50]},就不能跟£31 = {a G [10,20]}合并。[12].下面介紹負載調度算法。負載調度算法的目標是綜合f\ f4四個因素,得出一個比較優的渠道轉移方案。 選擇出一個較好的渠道轉移策略的過程分為兩步,第一步根據 其中
選擇出接收負載的服務器;第二步根據rank2(w2, g" gj, chik) = a f1 (gi, gj, chik) + & f3(gi, gj, chik) + y f4(gi, g」, chik) (10)選擇出gi上應該轉移的渠道。其中co G
和 a,旦,y (a ,旦,y G
, a+^ + y =1)是權重系數。 第一步中并沒有考慮4使用的渠道,而是使用avg(gi)作為計算ran、的一個參數。上述 兩個式子計算出的值都限制在(0,1)區間,得到的值越大,表明級別越高。第二步通過使用 已選擇出來的負載接收服務器,選擇出gi上需要轉移的事件渠道,這時同時考慮了轉移該 渠道后對負載平衡的影響、負載轉移開銷和訂閱就近放置三個方面的因素。同時需要注意 的是,在第二步的時候可能涉及到渠道的分割。在第一步計算時,設置了一個優先級隊列candidatejist用于選擇負載接收服 務器,candidate_list的大小就是最多選擇的接收服務器的數目。首先根據rank:式子,計 算出在uNodeList中服務器的等級值,根據計算出的等級高低放入candidatejist,然后 從candidatejist選擇第一個服務器(其級別最高)作為負載接收服務器&。然后檢查 如果將gi上負載最小的渠道轉移至g^上,gj是否會變成負載過重。如果不會負載過重,那 么就進入第二步,檢查每一個候選服務器,并根據rank2計算出來的值,選擇出需要轉移的 渠道。如果在第一步時,發現如果將gi上負載最小的渠道轉移至g^上,如果g^變成負載過重,那么就必須要進行渠道的分割操作了,另外,如果在第二步計算rank2時,在計算時, 如果找不到任何渠道chik,滿足dikE(0,2(p),也需要進行渠道分割操作。在選擇出負載接收服務器和可以轉移的渠道之后,負載移出服務器就向負載接 收服務器發送負載轉移請求,試圖與之建立負載轉移會話。如果負載接收服務器回復可 以接收負載,那么負載轉移會話建立,將事件渠道以及與之相關的訂閱由負載移出服務器 轉移到負載接收服務器;如果負載接收服務器不能接收負載,那么負載移出服務器將會從 candidatejist中選擇出來下一個服務器作為負載接收服務器,并且計算出可以轉移出去 的渠道,繼續向新的負載接收服務器發送負載轉移請求。[13].下面介紹本發明中負載調度的全部過程描述。1當服務器發現自己負載過重時(并且以一定的概率得出自己可以執行負載調度 過程),首先將自己的狀態置為BUSY,表明它正處在負載調度過程中,并且生成本地渠道表 的一份副本charmellist。注意在更新本地和全局路由表操作之前,負載移出服務器的本 地渠道表和全局路由表都保持不變。2負載移出服務器開始調用rar^函數,計算candidatejist。在使用ranki計算 candidate_list時,如果channel_list中只有唯一的一個事件渠道ch,那么必定需要分割 ch。如果要分割ch,則將ch從charmlejist中刪除,然后按照它的負載值分割成幾乎相等 的兩部分的標準分割,生成兩個新的渠道ch和ch2,將這個分割信息記錄在一個數據結構 splitlnfos中。splitlnfos中的每一項是被分割的渠道的id到渠道分割信息ChSplitlnfo 的一個映射,每一個ChSplitlnfo中記錄著被分割的父渠道和由此渠道分割出來的兩個子 渠道。另外,為了使用方便,同時將ch:和ch2放入集合newedCharmels中,如果ch已經存 在于newedChannels中,那么就把ch從中刪除。3如果candidate_list不為空,那么從candidate_list選擇出來第一個服務器作 為負載接收服務器(這個服務器的級別最高),并將其從隊列中刪除,向其發送負載轉移請 求消息。如果candidatejist為空,說明沒有任何服務器可以作為負載接收服務器,負載 平衡過程不能繼續下去,那么負載移出服務器將自己的狀態由BUSY置為OVERLOADED,終止 負載平衡過程,繼續等待下一次負載平衡的機會。4服務器接收到負載轉移請求消息后,如果服務器處于UNDERLOADED狀態,那么 它可以接受負載,就回復消息給負載移出服務器,說明它可以作為負載接收服務器,并將自 己的狀態設置為BUSY,說明它正參與負載調度過程;如果服務器處于BUSY、OVERLOADED、 STABLE等狀態時,則說明不能接收更多的負載,那么就回復消息給負載移出服務器,說明它 不能作為負載接收服務器。5負載移出服務器接收到負載請求消息的回復消息后,那么它將5. 1如果回復消息的服務器不能作為負載接收服務器,那么繼續3。5. 2如果回復消息的服務器可以作為負載接收服務器,那么將選定此服務器作為 負載接收服務器,并且選擇合適的渠道作為負載接收渠道的階段。在這個階段,將調用1^1^2函數,在1^1^2函數中,將調用&和&。在&的計算 時將計算出最佳的負載移出量,即推導過程中給出的9值。根據計算出各個事件渠道 的優先級,并按照優先級由高到低進行排列,放入這個一個候選渠道隊列ch_candidate_ list (注意,在1中如果負載移出服務器上只有1個事件渠道的情況下,已經發生了,如果從ch_candidate_list中的找不出前k個事件渠道,滿足I ^(load on ch,)-(p\< alpha,其
M
中alpha是允許的誤差值,可以取0.1*9,那么就需要對某些渠道進行分割,這時候必然存在 k k+\
<p-YjLD、ch;) > alpha,Y,LDichi)~(P> alPha,那么就分割 ch—candidate—list 中第 k+1 /=i /=i
個渠道油,其中分成一部分負載為供-^>/)(戲),分給出來的兩個新的渠道chl和ch2,同
i=\
樣的將ch從channel_list中刪除,同時更新splitlnfos和newedChannels兩個數據結
構,記錄渠道分割信息。然后再次調用函數,更新ch_candidate_list,直到可以從ch_
k
candidate—list中的找不出前k個事件渠道,滿足| ^(/o^ on戲)—爐,否則繼
i=l
續向前面一樣分割事件渠道。這樣,根據,可以對每一個待選的事件渠道給出對應的優
先級值,同樣經過f3,也對每一個待選的事件渠道給出對應的優先級值。經過rant計算
之后,得到每一個事件渠道的選擇優先級別隊列loCalCh_Candidate_liSt,從l0calch_
k
candidate list中的找出前k個事件渠道,滿足[(/oad 戲)-刮),其中就是 beta是允許的誤差值,這k個事件渠道就是要轉移出去的渠道,記錄在transferCharmels
隹入由 朱口 T o6負載移出服務器向負載接收服務器轉移渠道和負載。6. 1負載移出服務器向負載接收服務器發送渠道轉移消息。負載移出服務器將選 擇出來的轉移渠道包裝在一個渠道轉移消息內,發送至負載接收服務器,負載接收服務器 在接收到該消息后,將會在其localTable中添加轉移過來的渠道,在渠道建立成功之后將 會給負載移出服務器發送渠道建立成功的回復。6. 2負載移出服務器在接收到負載接收服務器的渠道建立成功消息之后,將會發 送訂閱轉移消息,把屬于轉移渠道的那些訂閱發送到負載接收服務器上,在發送的消息中, 還包含了這些訂閱屬于哪些渠道的信息。負載接收服務器收到訂閱轉移消息后,將會在訂 閱屬于的那些渠道中添加這些訂閱,在訂閱添加成功后將向負載移出服務器發送訂閱轉移 完成消息。7負載移出服務器更新本地的localTable和routingTable。負載移出服務器 在接收到轉移訂閱已經在負載接收服務器上建立完成之后,它開始更新本地事件渠道表 localTable和全局路由表routingTable。首先負載移出服務器將根據選擇出來的轉移渠 道transferChannels以及渠道分割信息記錄(splitlnfos和newedChannels)計算出5個 集合,包括l0CalAdd,是需要在localTable中添加的渠道(某些本地渠道被分割后仍然放 置在本地的那些渠道);localDel,是需要在localTable中刪除的渠道(已經被分割或者 已經被轉移);globalAdd是需要從routingTable中添加的渠道(由于渠道分割而新生成 的渠道);globalUpdate,是需要在routingTable中更新的渠道(它們的放置位置發生了 變化);globalDel,是需要在routingTable中刪除的渠道(它們已經被分割,不再存在)。 使用這5個集合分別更新本地的localTable和routingTable。更新的過程將對兩個表加 鎖,此時不能進行與這兩個表相關的操作。
8負載移出服務器在更新完localTable和routingTable后,將那些已經被轉移出 去的訂閱,并且不再說任何本地渠道表中的訂閱從本地服務器上清除。9負載移出服務器將globalAdd、globalUpdate和globalDel集合包裝成為全局 路由表更新消息,發送給所有的其他服務器,使其能夠更新自己的routingTable。10網絡中的其他服務器接收到全局路由表更新的消息之后,更新本地 的routingTab 1 e。更新的過程會對routingTab 1 e加鎖,這樣新來的消息將不能查 routingTable,直到更新完成。注意到不參與負載平衡過程的服務器只是自己本地的 routingTable,不需要更新本地的localTable,而負載接收服務器同樣也只需要更新本地 的routingTable,不需要更新本地渠道表localTable,因為在它處理渠道轉移消息的時候 本地localTable,將轉移的渠道添加了進去。服務器在更新完成之后,向負載移出服務器發 送事件空間更新完成消息。10負載移出服務器接收到所有服務器的全局路由表更新完成消息之后,向負載接 收服務器發送負載平衡過程完成消息,通知其負載平衡過程結束。負載移出服務器將本地 負載狀態由BUSY設置為STABLE,結束負載平衡過程。11負載接收服務器接收到負載完成消息后,將自己的負載狀態由BUSY設置為 STABLE。[14]下面介紹本發明的全部消息類型及其處理。本發明有如下16種類型的消息1、RoutingTablelnit消息,路由表初始化消息。在系統初始化時,由初始化 服務器向網絡中的其他所有服務器發送,用于初始化接收該消息的服務器的全局路 由表 routingTable 和本地渠道表 localTable。消息格式為(RoutingTablelnit routingTable),其中routingTable為全局路由表,包括了全部的渠道到服務器的放置位 置映射信息。2、ReplyRoutingTablelnit消息,確認全局路由表已經在服務器中創建 完畢。這個消息是服務器對IteplyRoutingTablelnit消息的回復。消息格式為 (ReplyRoutingTablelnit ),由于這個消息只是一個確認信息,在服務器接收到 RoutingTablelnit消息并建立好全局路由表和本地渠道表后,通知初始化服務器建立完 成,所以消息體中不必包含其他內容。3、Subscription消息,訂閱消息。表示一個訂閱請求,消息格式為 (Subscription :subExp, subscriber, dispatchSign, chID),其中 subExp 是訂閱的字符串 形式,subscriber是訂閱者的標識,dispatchSign是訂閱處理的標記,可取SUBSCRIBE_NEW 或SUBSCRIBE_DISPATCHED,chID是渠道標記。如果訂閱消息是從訂閱者直接發送過來的, 那么dispatchSign的取值為SUBSCRIBE_NEW,chID標記無意義,接入服務器在接收到這樣 的消息后,將查詢全局路由表routingTable,進而確定出訂閱應該由哪些渠道處理,如果渠 道在本地,則在本地處理該訂閱,如果需要轉發到在其他服務器上的渠道進行處理,則生成 新的訂閱消息,并將dispatchSign設置為SUBSCRIBE_DISPATCHED,將chID設置為該訂閱屬 于的那個渠道的id ;如果訂閱消息是從網絡中的其它服務器傳來的,則該訂閱消息必定是 dispatchSign為SUBSCRIBE_DISPATCHED,在chID中已經包含了該訂閱屬于的本地渠道,則 直接將該訂閱交由本地渠道進行處理。特殊的情況是,如果渠道所在的服務器正在處于負 載平衡過程中,并且是負載移出服務器,那么該訂閱消息將不會被渠道處理,將生成一個重傳消息Reforward,具體操作將在下面Reforward消息的介紹中給出。4、UnSubscription消息,取消訂閱消息。表示取消訂閱請求,消息格式為 (UnSubscription :unsubExp, unsubscriber, dispatchSign, chID),其中 unsubExp 是訂 閱的字符串形式,unsubscriber是訂閱者的標識,dispatchSign是訂閱處理的標記,可 取UNSUBSCRIBE_NEW或UNSUBSCRIBE_DISPATCHED,chID是渠道標記。如果取消訂閱消息 是從訂閱者直接發送過來的,那么dispatchSign的取值為UNSUBSCRIBE_NEW,chID標記 無意義,接入服務器在接收到這樣的消息后,將查詢全局路由表routingTable,進而確定 出該取消訂閱消息應該由哪些渠道處理,如果渠道在本地,則在本地處理該訂閱,如果需 要轉發到在其他服務器上的渠道進行處理,則生成新的取消訂閱消息,并將dispatchSign 設置為UNSUBSCRIBE_DISPATCHED,將chID設置為該訂閱屬于的那個渠道的id ;如果取 消訂閱消息是從網絡中的其它服務器傳來的,則該取消訂閱消息必定是dispatchSign為 UNSUBSCRIBE_DISPATCHED,在chID中已經包含了該訂閱屬于的本地渠道,則直接將該取消 訂閱消息交由本地渠道進行處理。特殊的情況是,如果渠道所在的服務器正在處于負載平 衡過程中,并且是負載移出服務器,那么該取消訂閱消息將不會被渠道處理,將生成一個重 傳消息Reforward,具體操作將在下面Reforward消息的介紹中給出。5、Event消息,事件消息。表示事件消息的到達,消息格式為(Event :eventExp, dispatchSign,chID),其中eventExp是訂閱的字符串形式,dispatchSign是事件處理的標 記,可取EVENT_NEW或EVENT_DISPATCHED,chID是渠道標記。如果取事件消息是從發布者 直接發送過來的,那么dispatchSign的取值為EVENT_NEW,chID標記無意義,接入服務器在 接收到這樣的消息后,將查詢全局路由表routingTable,進而確定出該事件應該由哪個渠 道處理,如果渠道在本地,則在本地處理該事件,如果需要轉發到在其他服務器上的渠道進 行處理,則生成新的事件消息,并將dispatchSign設置為EVENT_DISPATCHED,將chID設置 為該事件屬于的那個渠道的id ;如果事件消息是從網絡中的其它服務器傳來的,則該訂閱 消息必定是dispatchSign為EVENT_DISPATCHED,在chID中已經包含了該事件屬于的本地 渠道,則直接將該事件交由本地渠道進行處理。特殊的情況是,如果渠道所在的服務器正在 處于負載平衡過程中,并且是負載移出服務器,那么該事件消息將不會被渠道處理,將生成 一個重傳消息Reforward,具體操作將在下面Reforward消息的介紹中給出。6、LIEM(Load Information Exchange Message)消息,負載信息交換消息。各個 服務器每隔一段時間向所有其他服務器通過LIEM發送自己的信息。消息格式為(LIEM: brokerlD, brokerStatus, brokerD, brokerDC),其中,brokerlD 為發送月艮務器的標識; brokerStatus為當前發送服務器所處狀態,取值為UNDERLOADED、STABLE、OVERLOADED或者 BUSY ;brokerD為服務器的負載值,brokerDC為服務器的負載水平值。7,RequestLoadBanlance消息,請求負載平衡消息。由負載移出服務器發出,詢問 可作為負載接收服務器的候選節點是否可以接收負載,執行負載平衡過程。這個消息是當 服務器負載過重且監控機制允許其發起負載平衡過程時發送,對方節點是在ran、函數中 計算得到。格式為(RequestLoadBanlance :brokerD,brokerDC),其中 brokerD 是負載移 出服務器的負載,brokerDC是負載移出服務器的負載水平,用于接收服務器確認自己是否 可以參與負載平衡過程。8、ReplyRequestLoadBanlance 消息,對 RequestLoadBanlance 請求的回復消息。消息格式為(R印lyRequestLoadBanlance :status),其中status為當前節點所處狀態,如 果status的取值為UNDERLOADED,則說明該服務器可以作為負載接收服務器,如果負載接 收服務器接收到了這樣的消息后,則可以與負載接收服務器之間建立負載平衡會話,進行 進一步的操作;否則,則說明該服務器本身正處在其他服務器的負載平衡過程或者負載過 重,不適合接收新的負載平衡請求,負載移出服務器接收到這樣的回復消息后,將向下一個 候選服務器發送RequestLoadBanlance消息。9、ChannelTransfer消息,渠道轉移消息。由負載移出服務器向負載接收服務器 發送,表示服務器間進行渠道轉移。格式為(ChannelTransfer channels),其中channels 是轉移渠道的信息集合,每個渠道信息包括渠道的標識和渠道的表示。lO.RelplyChannelTransfer消息,渠道轉移消息的回復消息。由負載接收服務器 在接收到ChannelTransfer消息并在本地建立渠道表localTable中建立完新的渠道后向 負載移出服務器發送。消息格式為(RelplyChannelTransfer :r印lySign,channel IDs), 其中r印lySign為當前節點渠道建立是否成功的表示,其值為REPLY_SUCCESS (渠道建立成 功)或REPLY_FAIL(渠道建立失敗)兩種形式;charmellDs為負載接收服務器在本地建立 的若干渠道的標識信息集合。11、SubscriptionMove消息,轉移訂閱消息。這個消息是負載移出服務器 收到RelplyChannelTransfer消息,確認了相應渠道已經在負載接收服務器建立成 功后,將渠道對應的訂閱信息進行轉移時發送的。消息格式為(SubscriptionMove subscriptionType, chSubSet),其中subscriptionType為訂閱基本格式信息,標識轉移的 是原子訂閱還是復合訂閱;chSubSet包含了相應渠道的標識該渠道對應的所有訂閱。12、R印lySubscriptionMove 消息,SubscriptionMove 消息的回復消息。由負載接 收服務器向負載移出服務器發送,用于確認發送過來的訂閱在本地已經創建完畢。消息格 式為(R印lySubscriptionMove ),由于這個消息只是一個確認信息,所以不必包含其他 內容。負載移出服務器在接收到負載接收服務器將訂閱建立成功的消息之后,將更新本地 的渠道表localTable和存放在本地的全局路由表routingTable。13、UpdateRoutingTable消息,更新全局路由表消息。由負載移出服務器在收到 R印lySubMove消息,確認需要轉移出的訂閱已經在負載接收服務器創建成功后,并更新完 本地的localTable和routingTable后,向網絡中的所有其他服務器發送的全局路由表更 新請求。消息格式為(UpdateRoutingTable :deleteChs,updateChs),其中 deleteChs 為 應該在接收方服務器routingTable中刪除的渠道信息;updateChs為經過轉移過程后應該 在路由表中更新的渠道信息,包括新建立的渠道(直接添加)和重定向的渠道(渠道的放 置位置發生了變化,更新放置的服務器)。14、ReplyUpdateGlobal消息,確認全局路由表已經更新的消息,接收到 UpdateRoutingTable的服務器向負載移出服務器發送,表明服務器已經更新完全局路由 表。消息格式為(R印lyUpdateGlobal ),由于這個消息只是一個確認信息,所以不必包含 其他內容。15XompleteLoadBalance消息,負載平衡過程結束的消息。負載移出服務器接收 到所有其他節點路由表更新的確認后,向負載接收服務器發送,接負載接收服務器收到后 自行將服務器狀態轉換為STABLE。消息格式為(CompleteLoadBalance ),由于這個消息只是一個確認信息,所以不必包含其他內容。16,Reforward消息,負載平衡過程中消息重傳請求。這個消息是保證負載平衡過 程正確性的關鍵。負載移出服務器在負載平衡過程中,如果接收到訂閱、取消訂閱或事件消 息應該被其本地渠道處理,并且屬于需要轉移的事件渠道,那么這些消息也可能需要被負 載接收服務器處理,以保證在負載接收服務器上不丟失任何信息,這時候負負載移出服務 器需要根據其所處的負載平衡過程階段進行分別處理。在負載平衡過程中,標識出三個重 要的時間點,首先是負載平衡開始時刻記為<1>時刻,其次是渠道轉移完成時刻(這時需要 轉移的事件渠道已經在負載接收服務器建立)記為<2>時刻,最后是渠道相關的訂閱轉移 完成的時刻(這時訂閱已經在負載接收服務器建立,并且負載移出服務器的本地渠道表和 全局路由表已經更新完成)記為<3>時刻。<1>時刻和<3>時刻之間是負載平衡過程的主 要時間階段,在這段時間內,負載移出服務器對接收到的屬于轉移渠道的訂閱、取消訂閱和 事件消息需要特殊考慮在<1>時刻到<2>時刻之間,負載移出服務器仍然可以正常的處理訂閱、取消訂閱 和事件消息,因為在負載移出服務器上的渠道并沒有受到負載平衡過程的影響。但是此時 由于轉移渠道還沒有在負載接收服務器上建立,所以屬于負載接收服務器的這些渠道的暫 時不能進行訂閱添加、取消操作,需要對新來的與轉移渠道相關的訂閱、取消訂閱消息在負 載移出服務器上記錄,在<2>時刻將這些消息包裝成為Reforward消息重傳給負載接收服 務器。這個時候由于本地訂閱未發生轉移,事件消息仍然可以到來可以類似負載平衡過程 前在本地進行進行正確處理,而且不需要保存并重傳至負載接收服務器。在<2>時刻和<3>時刻之間,由于需要轉移的渠道已經在對方節點建立,并且負載 移出服務器在<2>時刻接收到渠道建立成功消息之后就立刻發送訂閱轉移消息,將與轉移 渠道相關的訂閱發送給負載接收服務器,并且如果有在<1>與<2>時刻之間需要重傳的訂 閱、取消訂閱消息,那么在發送完轉移訂閱消息之后,就將這些消息組織成為Reforward消 息進行重傳。之后,與屬于轉移渠道的訂閱、取消訂閱、事件消息可以直接重傳到相應節點 上進行處理,并且由于消息是按照到達序列順序發送的,亦可以保證消息的正確處理順序。Reforward 消息格式為(Reforward :chID,messages),其中 chID 表示該訂閱、 取消訂閱或者事件消息屬于的渠道的標識,messages可能為一條消息也可能為多條消 息,其中每條消息格式為(sign,message_prefiX),其中sign為消息類型標志,取值范 圍為 SUBSCRIBE_MESSAGE (訂閱消息),UNSUBSCRIBE_MESSAGE (取消訂閱消息),EVENT_ MESSAGE (事件消息);message_pref ix為消息體,如果為訂閱消息或是取消訂閱消息,那么 這其中還包含訂閱者的標識。
2權利要求
一種發布/訂閱系統的動態負載平衡方法,其特征在于,該系統包括由多個服務器組成的對等覆蓋網絡,網絡中的各個服務器均作為接入服務器接收訂閱和事件信息,并通過全局路由表確定該信息所屬的事件渠道后將其轉發至該事件渠道進行處理;所述動態負載平衡方法包括負載過重的服務器從本地選擇轉移負載并在其他服務器中選擇負載接收服務器,將該轉移負載發送至該負載接收服務器。
2.如權利要求1所述的發布/訂閱系統的動態負載平衡方法,其特征在于,服務器保存 本地渠道表和全局路由表,本地渠道表記錄服務器本地的事件渠道全局路由表記錄事件渠 道在服務器上的放置位置。
3.如權利要求1所述的發布/訂閱系統的動態負載平衡方法,其特征在于,負載接收服 務器收到轉移負載后,若該轉移負載的訂閱或事件消息屬于本地渠道,則直接將該轉移負 載交給該本地渠道處理。
4.如權利要求1所述的發布/訂閱系統的動態負載平衡方法,其特征在于,該系統通過 下列方法觸發所述動態負載平衡a)系統初始化時,服務器默認為低負載狀態;b)服務器之間按設定的周期共享各自的負載信息;c)服務器收到其他服務器的負載信息后計算平均負載并確定自身是否負載過重;d)負載過重的服務器按設定的概率觸發所述動態負載平衡。
5.如權利要求1所述的發布/訂閱系統的動態負載平衡方法,其特征在于,負載過重的 服務器通過下列方法在其他服務器中選擇負載接收服務器服務器根據ranlq式對其他服務器中負載過輕的服務器排序,得到序列candidate list,按照candidatejist中的順序選擇服務器作為負載接收服務器 其中ω e W,1],是權重系數;gi表示當前服務器,gj表示其他服務器之一,Chik表示 gi中的第k個渠道叫表示gi上的事件渠道數;bWij表示gi與gj之間的網絡帶寬,bwimax表 示gi到所有負載較低服務器的帶寬中的最大值; Ci和Cj分別表示gi和gj的處理能力,dCi和dCj分別表示gi和gj的負載水平,dik 是Chik的負載,Max(dc0-dik/c0)表示負載較重的服務器中(dCi-dik/Ci)值最大的服務器, Min(dcu-dik/cu)表示負載較輕的服務器中(dCj+dik/Cj)值最小的服務器;lev表示分級函數,leV(x)=「x_Z"|/Z,xe
,Γ 表示取整操作符,L表示層次數目。
6.如權利要求1所述的發布/訂閱系統的動態負載平衡方法,其特征在于,負載過重的 服務器通過下列方法從本地選擇轉移負載根據rank2式對本地渠道排序,按照得到的序列選擇渠道作為轉移渠道 其中α,β,Y是權重系數,α、β、γ e
, α+β + y =1 ;gi表示當前服務器,gj表示其他服務器之一,Chik表示gi中的第k個渠道;Ci和Cj分別表示gi和gj的處理能力,dik是Chik的負載,Hii表示gi上的事件渠道數;,, 其中乂=」--— d,和…分別表示gi和g^的負載水平,—表示‘c^;dc網絡中服務器負載水平的平均值, 分別表示和gj的負載水平,MaX(dc。-dik/c。)表示負載較重的服務器中(dCi_dik/Ci)值最 大的服務器,Min(dCu-dik/Cu)表示負載較輕的服務器中(dCj+dik/Cj)值最小的服務器, 其中,min_mig_cost表示gi的各個渠道中最小的負載轉移開銷,mig_cost {chik — gj} 表示chik到gj的轉移開銷; lev表示分級函數, ,1],「]表示取整操作符,L表示層次數目。
全文摘要
本發明公開了一種發布/訂閱系統的動態負載平衡方法。所述系統包括由多個服務器組成的對等覆蓋網絡,網絡中的各個服務器均作為接入服務器接收訂閱和事件信息,并通過全局路由表確定該信息所屬的事件渠道后將其轉發至該事件渠道進行處理;該系統在運行過程中進行動態負載平衡,動態負載平衡包括負載過重的服務器從本地選擇轉移負載并在其他服務器中選擇負載接收服務器,將該轉移負載發送至該負載接收服務器。本發明可用于金融服務、新聞服務、傳感器網絡、RFID應用等多個領域。
文檔編號H04L12/56GK101854299SQ20101018629
公開日2010年10月6日 申請日期2010年5月21日 優先權日2010年5月21日
發明者金蓓弘, 陳海彪, 齊鳳亮 申請人:中國科學院軟件研究所