Zookeeper教程-3 Watcher
技術標籤:Zookeeperzookeeperwatcher
Zookeeper提供了分散式資料釋出/訂閱功能,一個典型的釋出/訂閱模式系統定義了一種一對多的訂閱關係,能讓多個訂閱者同時監聽某一個主題物件,當這個主題物件自生狀態變化時,會通知所有訂閱者,使他們能夠做出相應的處理。
Zookeeper中,引入了Watcher機制來實現這種分散式的通知功能。Zookeeper允許客戶端向服務端註冊一個Watcher監聽,當服務端的一些事件觸發了這個Watcher,那麼就會向指定客戶端傳送一個事件通知來實現分散式的通知功能。
觸發事件種類很多,如:節點建立,節點刪除,節點改變,子節點改變等。
總的來說可以概括為以下三個過程:客戶端向服務端註冊Watcher,服務端事件發生觸發Watcher,客戶端回撥Watcher得到觸發事件情況
Watch機制特點
一次性觸發
事件發生觸發監聽,一個watcher event就會被髮送到設定監聽的客戶端,這種效果是一次性的,後續再發生同樣的事情,不會再次觸發
事件封裝
Zookeeper使用WatcherEven物件來封裝服務端事件並傳遞
WatcherEvent包含了每一個事件的三個基本屬性:
通知狀態(keeperState)
,事件型別(EventType)
和節點路徑(path)
event非同步傳送
watcher的通知事件從服務端傳送到客戶端是非同步的
先註冊再觸發
Zookeeper中的watch機制,必須客戶端先去服務端註冊監聽,這樣事件發生才會觸發監聽,通知客戶端
通知狀態和事件型別
同一個事件型別在不同的通知狀態中代表的含義有所不同,下表列舉了常見的通知狀態和事件型別
KeeperState | EventType | 觸發條件 | 說明 |
---|---|---|---|
None(-1) | 客戶端與服務端成功建立連線 | ||
SyncConnected(0) | NodeCreated(1) | Watcher監聽的對應資料節點被建立 | |
NodeDeleted(2) | Watcher監聽的對應資料節點被刪除 | 此時客戶端和服務端處於連線狀態 | |
NodeDataChanged(3) | Watcher監聽的對應資料節點的資料內容發生變更 | ||
NodeChildChanged(4) | Watcher監聽的對應資料節點的子節點列表發生變更 | ||
DisConnected(0) | None(-1) | 客戶端與Zookeeper伺服器斷開連線 | 此時客戶端和伺服器處於斷開連線狀態 |
Expired(-112) | Node(-1) | 會話超時 | 此時客戶端會話失效,通常同時也會收到SessionExpiredException異常 |
AuthFailed(4) | None(-1) | 通常有兩種情況,1:使用錯誤的schema進行授權檢查,2:SASL許可權檢查失敗 | 通常同時也會收到AuthFailedException異常 |
其中,連線狀態事假(type=None,path=null)不需要客戶端註冊
,客戶端只要有需要直接處理就行了。
Shell 客戶端設定watcher
建立一個測試節點:
create /watchtest 123
設定節點資料變動監聽:
get -w /watchtest
通過另外一個客戶端更改節點資料:
set /watchtest 456
此時設定監聽的節點收到通知:
再次更改節點資料:
set /watchtest 789
發現沒有收到通知,說明此方式是一次性的監聽事件。