Zookeeper Watcher機制使用注意事項

1、Watcher機制的特點

  • 一次性觸發(One-Time Trigger)
    當設置監視的數據發生改變時,該監視事件會被髮送到客戶端。例如,如果客戶端調用了 getData(“/znode1”, true) ,並且稍後 /znode1 節點上的數據發生了改變或者被刪除了,客戶端將會獲取到 /znode1 發生變化的監視事件,而如果 /znode1 再一次發生了變化,除非客戶端再次對 /znode1 設置監視,否則客戶端不會收到事件通知。

  • 發送給客戶端(Send to Client)
    Watch的通知事件是服務器異步發送給客戶端的,所以,不同的客戶端收到Watch事件的時間可能不同。
    但是,ZooKeeper有如下保證:一個客戶端在看到Watch事件之前是不會看到結點數據的變化的。例如:A=3,此時在上面設置了一次Watch,如果A突然變成4了,那麼客戶端會先收到Watch事件,然後纔會看到A=4。
    網絡延遲或者其他因素可能導致不同的客戶端在不同的時刻感知某一監視事件,但是不同的客戶端所看到的一切具有一致的順序。

  • 被設置了watch的數據(The data for which the watch was set)
    ZooKeeper維護了兩個watch列表:data watch和child watch。getData()和exists()設置data watch,而getChildren()設置child watch。
    getData()和exists()返回節點本身的信息,而getChildren()返回 子節點的列表。因此,setData()會觸發znode上設置的data watch(如果set成功的話)。
    一個成功的 create() 操作會觸發被創建的znode上的數據watch,以及其父節點上的child watch。而一個成功的 delete()操作將會同時觸發一個znode的data watch和child watch,同時也會觸發其父節點的child watch。
    Watch由client連接上的ZooKeeper服務器在本地維護。這樣可以減小設置、維護和分發watch的開銷。當一個客戶端連接到一個新的服務器上時,watch將會被以任意會話事件觸發。
    當與一個服務器失去連接的時候,是無法接收到watch的。而當client重新連接時,如果需要的話,所有先前註冊過的watch,都會被重新註冊。通常這是完全透明的。
    只有在一個特殊情況下,watch可能會丟失:對於一個未創建的znode的exist watch,如果在客戶端斷開連接期間被創建了,並且隨後在客戶端連接上之前又刪除了,這種情況下,這個watch事件可能會被丟失。

2、設置的Watcher監視不到數據的變化原因

可能的原因有如下幾種:

  • 客戶端與服務器之間的Session出現中斷;
  • 變化事件發生在前一個事件處理過程中,此時新的Watcher尚未設置生效;
  • 某個Watcher處理唄卡住,導致Session上設置的所有Watcher均無法生效。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章