zookeeper系列之異步通知模式--Watcher

轉載自: 
http://zoutm.iteye.com/blog/708468 
http://blog.csdn.net/qq910894904/article/details/41726279


Watcher介紹: 
  Watcher是Zookeeper用來實現distribute lock, distribute configure, distribute queue等應用的主要手段。要監控data_tree上的任何節點的變化(節點本身的增加,刪除,數據修改,以及孩子的變化)都可以在獲取該數據時註冊一個Watcher,這有很像Listener模式。一旦該節點數據變化,Follower會發送一個notification response,client收到notification響應,則會查找對應的Watcher並回調他們。 有以下接口可以註冊Watcher:

  • Stat exists(final String path, Watcher watcher)

  • Stat exists(String path, boolean watch)

  • void exists(String path, boolean watch, StatCallback cb, Object ctx)

  • void exists(final String path, Watcher watcher, StatCallback cb, Object ctx)

  • byte[] getData(final String path, Watcher watcher, Stat stat)

  • byte[] getData(String path, boolean watch, Stat stat)

  • void getData(final String path, Watcher watcher, DataCallback cb, Object ctx)

  • void getData(String path, boolean watch, DataCallback cb, Object ctx)

  • List getChildren(final String path, Watcher watcher)

  • List getChildren(String path, boolean watch)

  • void getChildren(final String path, Watcher watcher,ChildrenCallback cb, Object ctx)

  如果參數需要傳遞watcher,則可以自己定義Watcher進行回調處理。如果是Boolean型變量,當爲true時,則使用系統默認的Watcher,系統默認的Watcher是在zookeeper的構造函數中傳遞的Watcher。如果Watcher爲空或者Boolean變量時爲false,則表明不註冊Watcher。如果獲取數據後不需要關注該數據是否變化,就不需要註冊Watcher。上面沒有返回值的都是異步調用模式。需要注意的是,一旦Watcher被調用後,將會從map中刪除,如果還需要關注數據的變化,需要再次註冊。 Watcher原理 要搞清楚Watcher的原理,讓我們看看Watcher的工作流程。


Watcher的使用與注意事項

  Watcher需要每次都要註冊。

  並不是Watcher的節點被修改n次,客戶端註冊就會被通知n次。如果watcher的節點頻繁被修改,有可能修改了10次,客戶端被通知8次。如果client與server連接狀態發生改變,watcher總是會被通知。

Watcher通知類型:

  • state=-112 會話超時狀態
  • state= -113 認證失敗狀態
  • state= 1 連接建立中
  • state= 2 (暫時不清楚如何理解這個狀態,ZOO_ASSOCIATING_STATE)
  • state=3 連接已建立狀態
  • state= 999 無連接狀態 

  • type=1 創建節點事件
  • type=2 刪除節點事件
  • type=3 更改節點事件
  • type=4 子節點列表變化事件
  • type= -1 會話session事件
  • type=-2 監控被移除事件 


  對父節點的變更以及孫節點的變更都不會觸發watcher,而對watcher本身節點以及子節點的變更會觸發watcher,具體參照下表。

注:×表示否,√表示是。 
更多參見 http://tech.uc.cn/?p=1189,不過該文章中第五節對event和state的說明有誤,請仔細辨別。

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