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的说明有误,请仔细辨别。

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