首先我们先了解watcher的组成与机制

Watcher 的组成:zk客户端,zk服务器,watcherManager

 zookeeper watcher机制 总结

Watcher机制:

1 客户端向zk服务器注册watcher的同时,会将watcher的对象储存在客户端的watcherManager中;

2 zk服务器的触发watcher事件后会向客户端发送通知,客户端线程从watcherManager中掉起watcher执行

了解基本机制后我来看看watcher的接口

我们使用IDEA打开watcher的接口类

我们可以看到该接口只有一个process方法,用于处理watcher事件、有两个内部枚举类,一个是事件类型(EventType),一个是连接状态(KepperState);EventType有五种类型,KepperState8个状态

 zookeeper watcher机制 总结

zookeeper watcher机制 总结

Watcher事件关系图如下:

 zookeeper watcher机制 总结

事件简单说明:

NodeDataChanged:无论节点数据发生变化还是数据版本号发生变化都会触发;

NodeChildrenChange:节点下增删节点触发;

AuthFailed:授权失败触发;

需要指出的是:客户端与服务端创建连接成功与否关键是要看:是否触发了deFaultWatcher;只有触发dEfaultWatcher后会话才能真正的建立;

接下来我们看看watcher机制时序图

1 服务端处理过程

getData(“path”,watcher)为例:

 zookeeper watcher机制 总结

那我们看看FinalRequestProcessor类的具体实现:

如图(getData实现代码):

 zookeeper watcher机制 总结

①获得数据时需要判断是否需要注册watcher,如果要注册watcher需要传入cnxnServerCnxn cnxn = request.cnxn;request就是processRequest

 zookeeper watcher机制 总结

ServerCnxn cnxn对象:即包含了连接信息又包含了watcher信息:如下图ServerCnxn实现Statswatcher接口;

 zookeeper watcher机制 总结

this.zks.getZKDatabase().getData其中this.zks.getZKDatabase()返回的是ZKDatabase如图:

 zookeeper watcher机制 总结

GetData方法中调用了.dataTree.getData方法:

dataTree 类维护着zookeeper模型树数据结构;

通过DataTree.dataTree.getData方法可以获得节点的数据;

 zookeeper watcher机制 总结

④ 在获取数据的同时(其实是获取数据后,返回数据前)将添加watcherWatcherManager

 

以上就是服务端的watcher流程;

2 客户端流程:

 zookeeper watcher机制 总结

(以getData方法为例)

客户端代码图如图:

 zookeeper watcher机制 总结

说明流程图中的标号12对应代码中的12

 

至此基本watcher流程完成;

相关文章: