美文网首页zookeeper系列
zookeeper系列(二):watcher

zookeeper系列(二):watcher

作者: 范柏柏 | 来源:发表于2020-06-02 15:00 被阅读0次

数据变更的通知。是zookeeper发布/订阅的基础。

概念

  1. client向zkServer发送请求,说,我想要监听某个节点的修改。
  2. zkServer说,好的。
  3. zk的节点一旦有变化,zkServer会通知所有订阅这个节点的client,说,xxx这个节点有变化。
  4. client收到server的通知后,反查server端这个节点的信息,拿到具体的变化信息。反查函数其实是watcher的回调函数,在定义的时候,就定义好了要怎么反查。

以此来做到,针对某一个节点的监听。

watcher.png

watcher事件

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

watcher事件.png 触发器.png

只需要关注type不为空的那几个

  • 节点创建
  • 节点删除
  • 节点数据更新
  • 子节点列表更新(是子节点创建或者删除,子节点内容变更,不是列表更新)

client注册watcher的过程

注册的入口

  1. 在创建client的时候,zkClient中有带watcher的构造函数。
public Zookeeper(String connectStr, int sessionTimeout, Watcher watcher);

当注册了默认的watcher的时候,client在getData设置watcher的时候,直接用true,就用到了默认的wather。

  1. 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的方法。

注册的过程

  1. client在调用getData之后,客户端会将watcher信息,封装到request中,将requst发送给server。

  2. 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;
注册流程.png

watcher触发的过程

一旦节点变动,触发了watcher。

  1. 封装watcherEvent
    首先将通知状态(KeeperState)、事件类型(EventType)以及节点路径(Path)封装成一个WatcherEvent对象。

  2. 查询watcherManager
    去watcherManager找监听这个节点的client的watcher。遍历,一个一个通知。然后,重点来了,拿到watchet之后,用完就删除。也就说,watcher是一次性的,要持续监听某个节点就要持续注册watcher。

  3. 调用process方法触发watcher
    第2步中,拿到了所有的watcher,调用watcher中的process方法。process方法很简单,就是回调client,你监听的这个节点变动了。

  4. client收到watcher的process后。框架层会调用client的process方法。client自己的process是业务相关的代码了,得自己实现。比如


    process.png
触发流程.png

相关文章

网友评论

    本文标题:zookeeper系列(二):watcher

    本文链接:https://www.haomeiwen.com/subject/lwquzhtx.html