ZooKeeper Watch筆記_第1頁(yè)
ZooKeeper Watch筆記_第2頁(yè)
ZooKeeper Watch筆記_第3頁(yè)
ZooKeeper Watch筆記_第4頁(yè)
ZooKeeper Watch筆記_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Watcher詳解、接口    在 ZooKeeper 中, 接口類(lèi) Watcher 用于表示一個(gè)標(biāo)注你的事件處理器,其定義了事件通知相關(guān)的邏輯,包含 KeeperState 和 EventType 兩個(gè)枚舉類(lèi),分別代表了通知狀態(tài)和事件類(lèi)型,同時(shí)定義了事件的回調(diào)方法:process(WatchedEvent event)Watcher 觸發(fā)條件:    增、刪、改 ( 重復(fù)修改也會(huì)觸發(fā),因?yàn)樗桓嬖V你變更了,不告訴你變更多少,需要 C 自己去拿)abstract public  void process ( WatchedEvent event

2、 )。    process() 是 Watch 接口中的回調(diào)方法。當(dāng) ZooKeeper 向客戶(hù)端發(fā)送一個(gè) Watcher 時(shí)間通知時(shí),客戶(hù)端就會(huì)對(duì)相應(yīng)的 process 方法進(jìn)行回調(diào),從而實(shí)現(xiàn)對(duì)事件的處理。 like this:syncNodes()方法。        Watcher 設(shè)置是開(kāi)發(fā)中最常見(jiàn)的,需要搞清楚watcher的一些基本特征,對(duì)于exists、getdata、getchild對(duì)于節(jié)點(diǎn)的不同操作會(huì)收到不同的 watcher信息對(duì)父節(jié)點(diǎn)的變更以

3、及子節(jié)點(diǎn)的變更都不會(huì)觸發(fā)watcher,而對(duì)watcher本身節(jié)點(diǎn)以及子節(jié)點(diǎn)的變更會(huì)觸發(fā)watcher繼續(xù)。ZooKeeper 使用 WatchedEvent 對(duì)象封裝服務(wù)端事件并傳遞給 Watcher, 從而方便回調(diào)方法 process 對(duì)服務(wù)端事件進(jìn)行處理。WatcherEvent 實(shí)體實(shí)現(xiàn)了序列化接口,因此可以用于網(wǎng)絡(luò)傳輸。數(shù)據(jù)結(jié)構(gòu)如下。Class WatcherEvent  type:int  state:int  path:Stringstate=-112 會(huì)話超時(shí)狀態(tài)state= -113認(rèn)證失敗狀態(tài)state= 

4、0;1 連接建立中state= 2 (暫時(shí)不清楚如何理解這個(gè)狀態(tài),ZOO_ASSOCIATING_STATE)state=3 連接已建立狀態(tài)state= 999 無(wú)連接狀態(tài)type=1 創(chuàng)建節(jié)點(diǎn)事件type=2 刪除節(jié)點(diǎn)事件type=3 更改節(jié)點(diǎn)事件type=4 子節(jié)點(diǎn)列表變化事件type= -1 會(huì)話session事件type=-2 監(jiān)控被移除事件Watcher 發(fā)送過(guò)程。        當(dāng)服務(wù)端產(chǎn)生 WatchedEvent 事件之后,會(huì)調(diào)用 getWrapper 方法將自己包裝成一個(gè)可序列化的 Watcher

5、Event 事件,以便于通過(guò)網(wǎng)絡(luò)傳輸?shù)娇蛻?hù)端??蛻?hù)端在接收到服務(wù)端的這個(gè)事件對(duì)象后,首先會(huì)將 WatcherEvent 事件還原成一個(gè) WatchedEvent 事件。并傳遞給 process方法處理。 回調(diào)方法根據(jù)傳入?yún)?shù)解析完整服務(wù)端事件。Watcher 發(fā)送的數(shù)據(jù)            無(wú)論是 WatcherEvent 還是 WatchedEvent,他對(duì) ZooKeeper 服務(wù)端事件的封裝都是極其簡(jiǎn)單的。 當(dāng) /Test/te

6、st1/1_1節(jié)點(diǎn)發(fā)生變更時(shí),服務(wù)端會(huì)發(fā)送給客戶(hù)端一個(gè)“ZNode數(shù)據(jù)變更“ 事件,客戶(hù)端也只能接收到如下信息:    KeeperState : SyncConnected    EventType : NodeDataChanged    Path : /zk-b            也就是說(shuō),客戶(hù)端無(wú)法直接從該事件中獲取到對(duì)應(yīng)數(shù)據(jù)節(jié)點(diǎn)的原始數(shù)據(jù)內(nèi)容,以及變更后的新數(shù)據(jù)內(nèi)容。而是客戶(hù)端再次主動(dòng)去重新獲取數(shù)據(jù)。這個(gè)也是 ZooKeeper 一個(gè)非常重要

7、的特性。Watcher 工作機(jī)制服務(wù)端發(fā)送不處理邏輯、客戶(hù)端發(fā)送并處理邏輯??蛻?hù)端注冊(cè) Watcher        創(chuàng)建一個(gè) new ZooKeeper() 客戶(hù)端對(duì)象實(shí)例時(shí),可以傳入一個(gè) Watcher .      new ZooKeeper(String connectString,int sessionTimeout, Watcher watcher)       

8、  這個(gè)Watcher 將作為整個(gè) ZooKeeper 回話期間的默認(rèn) Watcher,會(huì)一直被保存在客戶(hù)端 ZKWatchManager 的 defaultWatcher 中。 另外,ZooKeeper 客戶(hù)端也可以通過(guò) getData、 getChildren 和 exist 三個(gè)接口來(lái)向 ZooKeeper 服務(wù)器注冊(cè) Watcher。 列舉個(gè)getData 例:            public byte getData(String path,

9、boolean watch, Stat stat)      public byte getData(final String path,Watcher watch, Stat stat)        第一個(gè)通過(guò)一個(gè) boolean 參數(shù)來(lái)標(biāo)識(shí)是否使用默認(rèn) Watcher 進(jìn)行注冊(cè),具體注冊(cè)邏輯與第二個(gè)接口一致。注冊(cè) Watcher 后     

10、   在 getData 接口注冊(cè) Watcher 后,客戶(hù)端首先會(huì)對(duì)當(dāng)前客戶(hù)端請(qǐng)求 request 進(jìn)行標(biāo)記, 將其設(shè)置為 ”使用Watcher“監(jiān)聽(tīng)。同時(shí)會(huì)封裝一個(gè) Watcher 的注冊(cè)信息,WatchRegistration 對(duì)象。 用于暫時(shí)保存數(shù)據(jù)節(jié)點(diǎn)的路徑 和 Watcher 的對(duì)應(yīng)關(guān)系。Packet 與 WatchRegistration。 Packet 類(lèi)        在 ZooKeeper 中 Packet 可以看做是一個(gè)最小的通信協(xié)議單元,用于進(jìn)行客戶(hù)端與服務(wù)端之間的網(wǎng)絡(luò)傳輸,任何需要傳輸?shù)膶?duì)象都需要包

11、裝成一個(gè) Packet 對(duì)象。 因此,在 ClientCnxn 中 WatchRegistration 又會(huì)被封裝到 Packet 中去, 然后放入發(fā)送隊(duì)列中等待客戶(hù)端發(fā)送。隨后,ZooKeeper 客戶(hù)端就會(huì)向服務(wù)端發(fā)送這個(gè)請(qǐng)求,同時(shí)等待請(qǐng)求的返回。完成請(qǐng)求發(fā)送后,會(huì)由客戶(hù)端 SendThread 線程的 readResponse 方法負(fù)責(zé)接收來(lái)自服務(wù)端的相應(yīng), finishPacket 方法會(huì)從 Packet 中取出對(duì)象的 Watcher 并注冊(cè)到 ZKWatchManager 中去。        WatchRegis

12、tration 封裝到了 Packet 對(duì)象中去,但事實(shí)上,在底層的網(wǎng)絡(luò)傳輸過(guò)程中,沒(méi)有將 WatchRegistration 對(duì)象完全的序列化到底層字節(jié)數(shù)組中去。ZooKeeper 只會(huì)將 requestHeader 和 request 兩個(gè)屬性進(jìn)行序列化。 也就是說(shuō),即使WatchRegistration 對(duì)象唄封裝在了 Packet 中,但是并沒(méi)有被序列化到底層字節(jié)數(shù)組中去。因此也就不會(huì)進(jìn)行網(wǎng)絡(luò)傳輸了。客戶(hù)端 Watcher 的注冊(cè)流程如下:       服務(wù)端注冊(cè) Watcher 服務(wù)端處理 Watcher 的序列圖:1 Fi

13、nalRequest PcessRequest( ) 中會(huì)判斷當(dāng)前請(qǐng)求是否是需要注冊(cè) Watcher:        1) 如果 ZooKeeper 判斷當(dāng)前客戶(hù)端需要進(jìn)行 Watcher 注冊(cè),于是就會(huì)將當(dāng)前的 ServerCnxn 對(duì)象和數(shù)據(jù)路徑傳入 getData 方法中去。 ServerCnxn 是一個(gè) ZooKeeper 客戶(hù)端和服務(wù)器之間的連接接口,代表了一個(gè)客戶(hù)端和服務(wù)器的連接。我們可以 ServerCnxn 看做是一個(gè) Watcher 對(duì)象。因?yàn)樗麑?shí)現(xiàn)了 Watcher 的 proce

14、ss 接口WatcherManager    是 ZooKeeper 服務(wù)端 Watcher 的管理者,其內(nèi)部管理的 watchTable 和 watch2Paths 兩個(gè)存儲(chǔ)結(jié)構(gòu),分別從兩個(gè)維度對(duì) Watcher 進(jìn)行存儲(chǔ)。    1) watchTable     是從數(shù)據(jù)節(jié)點(diǎn)路徑的粒度管理 Watcher。    2) watch2Paths   是從 Watcher 的粒度來(lái)控制事件觸發(fā)的數(shù)據(jù)節(jié)點(diǎn)在服務(wù)端,DataTree 中會(huì)托管兩個(gè) Watch

15、Manager, 分別是 dataWatches (數(shù)據(jù)變更Watch) 和 childWatches(子節(jié)點(diǎn)變更Watch)。Watcher 觸發(fā)邏輯     1    封裝 WatchedEvent。            將通知狀態(tài) - KeeperState、事件類(lèi)型 - EventType、節(jié)點(diǎn)路徑 - Path 封裝成一個(gè) WatchedEvent 對(duì)象     2    查

16、詢(xún) Watcher。             根據(jù)路徑從 watchTable 中取出對(duì)應(yīng)的 Watcher。若無(wú)-沒(méi)注冊(cè) 直接退出。若有-注冊(cè)過(guò) 將數(shù)據(jù)提取出來(lái) 同時(shí) 從wTable w2Paths 中刪除掉。 Watcher 在服務(wù)端也是一次性的     3    調(diào)用 process 方法觸發(fā) Watcher             ZooK

17、eeper 會(huì)把當(dāng)前請(qǐng)求對(duì)應(yīng)的 ServerCnxn 作為一個(gè) Watcher 存儲(chǔ),因此調(diào)用 process 方法,事實(shí)上就是 ServerCnxn 對(duì)應(yīng)的 process 方法??蛻?hù)端回調(diào) Watcher      1    反序列化                字節(jié)流轉(zhuǎn)換成 WatcherEvent 對(duì)象      2    處理 chrootPath

18、0;               如果客戶(hù)端設(shè)置了 chrootPath 屬性,那么需要對(duì)服務(wù)器傳過(guò)來(lái)的完整節(jié)點(diǎn)路徑進(jìn)行 chrootPath 處理,生成客戶(hù)端的一個(gè)相對(duì)節(jié)點(diǎn)路徑。 例如客戶(hù)端 cPath路徑 /Test/test1 那么針對(duì)服務(wù)端傳過(guò)來(lái)的相應(yīng)包含的節(jié)點(diǎn)路徑為/Test/test1/1_19, 經(jīng)過(guò)chrootPath 處理后 會(huì)變成一個(gè)相對(duì)路徑:/ 1_19.      3    還原 WatchedEvent

19、0;               WatcherEvent 轉(zhuǎn)換成 WatchedEvent.      4    回調(diào) Watcher。                最后將 WatcherEvent 對(duì)象交給 EventThread 線程,在下一個(gè)輪詢(xún)周期中進(jìn)行 Watcher 回調(diào)。EventThread 處理時(shí)間通知。&

20、#160;       SendThread 接收到服務(wù)端的通知事件后,會(huì)通過(guò)調(diào)用 EventThread.queueEvent 方法將事件傳給 EventThread 線程。queueEvent 方法首先會(huì)根據(jù)該通知事件,從 ZKWatchManager 中取出所有相關(guān)的 Watcher 客戶(hù)端識(shí)別出 事件類(lèi)型 EventType 后,會(huì)從相應(yīng)的 Watcher 存儲(chǔ) (即3個(gè)注冊(cè)方法)中去除對(duì)應(yīng)的 Watcher。獲取到相關(guān)的所有 Watcher 后,會(huì)將其放入 waitingEvents 這個(gè)隊(duì)列去。    

21、        注意 此處調(diào)用的是 remove 接口。 客戶(hù)端的 Watcher 同樣也是一次性的。即一旦被觸發(fā),該Watcher 就失效了。        3個(gè)注冊(cè)方法: dataWatches、existWatcher 或 childWatcher 中的一個(gè)或多個(gè)        waitingEvents 是一個(gè)待處理 Watcher 的隊(duì)列,EventThread 的 run 方法會(huì)不斷對(duì)該隊(duì)列進(jìn)行處理Watcher 特性總結(jié):    一次性        &

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論