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