1. 程式人生 > 其它 >Zookeeper教程-3 Watcher

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機制,必須客戶端先去服務端註冊監聽,這樣事件發生才會觸發監聽,通知客戶端

通知狀態和事件型別

同一個事件型別在不同的通知狀態中代表的含義有所不同,下表列舉了常見的通知狀態和事件型別

KeeperStateEventType觸發條件說明
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

此時設定監聽的節點收到通知:
watch監聽
再次更改節點資料:

set /watchtest 789

發現沒有收到通知,說明此方式是一次性的監聽事件。

Zookeeper視訊教程