一 首先我们先了解watcher的组成与机制
Watcher 的组成:zk客户端,zk服务器,watcherManager
Watcher机制:
1 客户端向zk服务器注册watcher的同时,会将watcher的对象储存在客户端的watcherManager中;
2 zk服务器的触发watcher事件后会向客户端发送通知,客户端线程从watcherManager中掉起watcher执行
二 了解基本机制后我来看看watcher的接口
我们使用IDEA打开watcher的接口类
我们可以看到该接口只有一个process方法,用于处理watcher事件、有两个内部枚举类,一个是事件类型(EventType),一个是连接状态(KepperState);EventType有五种类型,KepperState有8个状态
Watcher事件关系图如下:
事件简单说明:
NodeDataChanged:无论节点数据发生变化还是数据版本号发生变化都会触发;
NodeChildrenChange:节点下增删节点触发;
AuthFailed:授权失败触发;
需要指出的是:客户端与服务端创建连接成功与否关键是要看:是否触发了deFaultWatcher;只有触发dEfaultWatcher后会话才能真正的建立;
三 接下来我们看看watcher机制时序图
1 服务端处理过程
以getData(“path”,watcher)为例:
那我们看看FinalRequestProcessor类的具体实现:
如图(getData实现代码):
①获得数据时需要判断是否需要注册watcher,如果要注册watcher需要传入cnxn(ServerCnxn cnxn = request.cnxn;)request就是processRequest;
ServerCnxn cnxn对象:即包含了连接信息又包含了watcher信息:如下图ServerCnxn实现Stats与watcher接口;
②this.zks.getZKDatabase().getData其中this.zks.getZKDatabase()返回的是ZKDatabase如图:
GetData方法中调用了.dataTree.getData方法:
③dataTree 类维护着zookeeper模型树数据结构;
通过DataTree的.dataTree.getData方法可以获得节点的数据;
④ 在获取数据的同时(其实是获取数据后,返回数据前)将添加watcher到WatcherManager;
以上就是服务端的watcher流程;
2 客户端流程:
(以getData方法为例)
客户端代码图如图:
说明流程图中的标号1,2对应代码中的1,2;
至此基本watcher流程完成;