zookeeper的watcher機制

zookeeper的watcher機制

ZooKeeper 提供了分佈式數據發佈/訂閱功能,一個典型的發佈/訂閱模型系統定義了一種一對多的訂閱關係,能讓多個訂閱者同時監聽某一個主題對象,當這個主題對象自身狀態變化時,會通知所有訂閱者,使他們能夠做出相應的處理。
ZooKeeper 中,引入了 Watcher 機制來實現這種分佈式的通知功能。ZooKeeper 允許客戶端向服務端註冊一個 Watcher 監聽,當服務端的一些事件觸發了這個 Watcher,那麼就會向指定客戶端發送一個事件通知來實現分佈式的通知功能。
觸發事件種類很多,如:節點創建,節點刪除,節點改變,子節點改變等。
總的來說可以概括 Watcher 爲以下三個過程:客戶端向服務端註冊 Watcher、服務端事件發生觸發 Watcher、客戶端回調 Watcher 得到觸發事件情況。

Watch 機制特點

  • 一次性觸發
    事件發生觸發監聽,一個 watcher event 就會被髮送到設置監聽的客戶端,這種效果是一次性的,後續再次發生同樣的事件,不會再次觸發。
  • 事件封裝
    ZooKeeper 使用 WatchedEvent 對象來封裝服務端事件並傳遞。
    WatchedEvent 包含了每一個事件的三個基本屬性:通知狀態(keeperState),事件類型(EventType)和節點路徑(path)
  • event 異步發送
    watcher 的通知事件從服務端發送到客戶端是異步的。
  • 先註冊再觸發
    Zookeeper 中的 watch 機制,必須客戶端先去服務端註冊監聽,這樣事件發送纔會觸發監聽,通知給客戶端。

常見的zookeeper服務的操作

操作 描述
create 創建一個znode(必須要有父節點)
delete 刪除一個znode(該znode不能有任何子節點)
exists 測試一個znode是否存在並且查詢他的元數據
getACL,setACL 獲取/設置一個znode的ACL
getChildren 獲取一個znode的子節點列表
getData,setdata 獲取/設置一個znode所保存的數據
sync 將客戶端的znode視圖與zookeeper同步
(將當前客戶端連接上的znode數據與主節點同步,將數據更新到最新)

注意:

  1. 在使用delete 或 setData操作時必須提供被更新的版本號(可以通過exists操作獲得)。
  2. zookeeper的寫操作是具有原子性的,在寫操作沒有完成前,zookeeper允許客戶端讀到的數據之後於zookeeper服務的最新狀態。
  3. zookeeper中有一個被稱爲multi的操作,用於將多個基本操作集合組成一個操作單元,並確保這些基本操作同時被成功執行,或者同時失敗。

常見的通知狀態和事件類型

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

雖然說zookeeper需要先註冊再觸發,但是連接狀態事件(type=None, path=null)不需要客戶端註冊,客戶端只要有需要直接處理就行了。

不同的觀察能被觸發事件不同

  1. 當所觀察的znode被創建、刪除或其數據被更新時,設置在exists 操作上的觀察將被觸發。
  2. 當所觀察的znode 被刪除,或其數據被更新時,設置在getData操作上的觀察將被觸發。創建znode不會觸發getData操作上的觀察,應爲getData操作成功執行的前提時znode必須已經存在
  3. 所觀察的znode的一個子節點被創建或被刪除的時候,或者所觀察的znode自己被刪除的時候,設置在getChildren操作上的觀察將被觸發,可以通過觀察事件的類型來判斷被刪除的是 znode 還是其子節點;NodeDelete類型代表znode被刪除,NodeChildrenChanged類型代表一個子節點被刪除。
KeeperState EventType 觸發條件 說明
None(-1) 客戶端與服務端成功建立連接
SyncConnected(0) NodeCreated(1) Watcher 監聽的對應數據節點被創建
NodeDeleted(2) Watcher 監聽的對應數據節點被刪除 此時客戶端和服務器處於連接狀態
NodeDataChanged(3) Watcher 監聽的對應數據節點的數據內容發生變更
NodeChildChanged(4) Wather 監聽的對應數據節點的子節點列表發生變更
Disconnected(0) None(-1) 客戶端與 ZooKeeper 服務器斷開連接 此時客戶端和服務器處於斷開連接狀態
Expired(-112) Node(-1) 會話超時 此時客戶端會話失效,通常同時也會受到SessionExpiredException 異常
AuthFailed(4) None(-1) 通常有兩種情況,1:使用錯誤的schema 進行權限檢查 2:SASL 權限檢查失敗 通常同時也會收到 AuthFailedException 異常

Shell 客戶端設置 watcher

在zookeeper中,不是所有的命令後面都可以添加監聽的,我們可以在zookeeper的shell客戶端下使用 help 命令查看所有的命令,命令後面有 [watch] 的則表示可以設置監聽。

設置watcher監聽01

我們在根路徑下創建一個持久節點來測試這個監聽,這裏測試的是當該節點裏的數據變化時觸發。

  1. 創建測試的持久節點
  2. 設置數據變化的監聽
  3. 使用另一個客戶端來修改數據,觸發這個監聽。

設置watcher監聽02

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