zookeeper watch模型

1.摘要

  • Watcher相關類簡介,類圖說明
  • Watcher的意義,通知狀態(keeperState)與事件類型(EventType)
  • WatchedEvent 和 WatcherEvent 描述zk檢測到變化的事件,以及對應用於網絡傳輸的封裝類

2.watcher相關類圖

  • Watcher,接口類型,其定義了process方法,另外定義內部類Event,再包含內部類KeeperState和EventType來描述Event發生時zk的狀態以及對應event類型
  • WatchedEvent,代表zk上一個Watcher能夠迴應的變化,包含了變化事件的類型,zk狀態以及變化影響的znode的path
  • WatcherEvent : 是WatchedEvent用於網絡傳輸的封裝類
  • ClientWatchManager:接口,根據Event得到需要通知的watcher
  • ZKWatchManager爲ClientWatchManager的實現

3.Watcher

Watcher是什麼

ZK中引入Watcher機制來實現分佈式的通知功能
ZK允許客戶端向服務端註冊一個Watcher監聽,當服務點的的指定事件觸發監聽時,那麼服務端就會向客戶端發送事件通知,以便客戶端完成邏輯操作(即客戶端向服務端註冊監聽,並將watcher對象存在客戶端的Watchermanager中
服務端觸發事件後,向客戶端發送通知,客戶端收到通知後從wacherManager中取出對象來執行回調邏輯)

特性

一次性:一旦一個watcher被觸發,ZK都會將其從相應的的存儲中移除,所以watcher是需要每註冊一次,纔可觸發一次。
客戶端串行執行:客戶端watcher回調過程是一個串行同步的過程
輕量:watcher數據結構中只包含:通知狀態、事件類型和節點路徑

在ZooKeeper中,接口類Watcher定義了事件通知相關的邏輯,包含了KeeperState和EventType兩個枚舉類,分別代表通知狀態和事件類型。

類圖如下

簡單介紹上面類圖就是

Watcher接口擁有process函數,用於處理回調
內部類Event又包含內部類KeeperState以及EventType
KeeperState用於記錄Event發生時的zk狀態(通知狀態)
EventType用於記錄Event的類型

3.1方法process

//回調函數實現該函數,表示根據event執行的行爲
abstract public void process(WatchedEvent event);

3.2內部類Event

包含KeeperState和EventType兩個內部類,通過枚舉類實現
方法很簡單,就是int值與對應枚舉類型的轉換
兩者的枚舉類型以及兩者之間的關係,觸發條件可以參考《paxos到zk》中的圖

KeeperState與EventType一覽表

4.WatchedEvent 和 WatcherEvent

WatchedEvent :代表zk上一個Watcher能夠迴應的變化,包含了變化事件的類型,zk狀態以及變化影響的znode的path
WatcherEvent : 是WatchedEvent用於網絡傳輸的封裝類

WatchedEvent 類圖如下

WatchedEvent類圖

三個成員變量很好的解釋了WatchedEvent的意義,即事件的類型,zk狀態以及變化影響的znode的path
方法基本都好理解,涉及WatcherEvent 有一個構造方法和一個getWrapper方法
這裏稍微強調一下 getWrapper方法

   /**
     *  Convert WatchedEvent to type that can be sent over network
     */
    //轉化成可供網絡傳輸,序列化的WatcherEvent
    public WatcherEvent getWrapper() {
        return new WatcherEvent(eventType.getIntValue(), 
                                keeperState.getIntValue(), 
                                path);
    }
}

WatcherEvent實現了Record接口,可以理解爲WatchedEvent用於網絡傳輸的封裝類

感興趣的可以掃描關注微信公衆號,會分享一些技術總結以及大廠的面試經驗。

公衆號:說說互聯網的那些事

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章