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用於網絡傳輸的封裝類
感興趣的可以掃描關注微信公衆號,會分享一些技術總結以及大廠的面試經驗。
公衆號:說說互聯網的那些事