数据变更的通知。是zookeeper发布/订阅的基础。
概念
- client向zkServer发送请求,说,我想要监听某个节点的修改。
- zkServer说,好的。
- zk的节点一旦有变化,zkServer会通知所有订阅这个节点的client,说,xxx这个节点有变化。
- client收到server的通知后,反查server端这个节点的信息,拿到具体的变化信息。反查函数其实是watcher的回调函数,在定义的时候,就定义好了要怎么反查。
以此来做到,针对某一个节点的监听。

watcher事件
上面说了,监听某个节点的变化,那都有什么变化呢


只需要关注type不为空的那几个
- 节点创建
- 节点删除
- 节点数据更新
- 子节点列表更新(是子节点创建或者删除,子节点内容变更,不是列表更新)
client注册watcher的过程
注册的入口
- 在创建client的时候,zkClient中有带watcher的构造函数。
public Zookeeper(String connectStr, int sessionTimeout, Watcher watcher);
当注册了默认的watcher的时候,client在getData设置watcher的时候,直接用true,就用到了默认的wather。
- getData、getChildren、exist
public byte[] getData(String path, boolean watch, Stat stat); // 就是这里,true,就用默认的wather来注册watcher
public byte[] getData(final String path, Watcher watcher, Stat stat);
别看名字是getData,这几个方法就是注册watcher的方法。
注册的过程
-
client在调用getData之后,客户端会将watcher信息,封装到request中,将requst发送给server。
-
client等待server的返回,收到server说注册成功的返回后,client会将watcher信息保存到watcherManager中。
watcherManager是两个map。
/**
* key为节点的路径。value为所有监听该节点的watcher
*/
Map<String, Set<Watcher>> watchTable;
/**
* key为Watcher。value为该watcher监听的所有节点path
*/
Map<Watcher, Set<String>> watch2Paths;

watcher触发的过程
一旦节点变动,触发了watcher。
-
封装watcherEvent
首先将通知状态(KeeperState)、事件类型(EventType)以及节点路径(Path)封装成一个WatcherEvent对象。 -
查询watcherManager
去watcherManager找监听这个节点的client的watcher。遍历,一个一个通知。然后,重点来了,拿到watchet之后,用完就删除。也就说,watcher是一次性的,要持续监听某个节点就要持续注册watcher。 -
调用process方法触发watcher
第2步中,拿到了所有的watcher,调用watcher中的process方法。process方法很简单,就是回调client,你监听的这个节点变动了。 -
client收到watcher的process后。框架层会调用client的process方法。client自己的process是业务相关的代码了,得自己实现。比如
process.png

网友评论