Zookeeper的Watcher实现-杂谈-IT技术博客

Zookeeper的Watcher实现

时间:2019-08-26 20:07:35 浏览: 字体: 放大 缩小


客户端注册Watcher实现

1.调用getData()/getChildren()/exist()三个API,传入Watcher对象

2.标记请求request,封装Watcher到WatchRegistration

3.封装成Packet对象,发服务端发送request

4.收到服务端响应后,将Watcher注册到ZKWatcherManager中进行管理

5.请求返回,完成注册。


服务端处理Watcher实现

1.服务端接收Watcher并存储

接收到客户端请求,处理请求判断是否需要注册Watcher,需要的话将数据节点的节点路径和ServerCnxn(ServerCnxn代表一个客户端和服务端的连接,实现了Watcher的process接口,此时可以看成一个Watcher对象)存储在WatcherManager的WatchTable和watch2Paths中去。


2.Watcher触发

以服务端接收到 setData() 事务请求触发NodeDataChanged事件为例:

    •         封装WatchedEvent

    •         将通知状态(SyncConnected)、事件类型(NodeDataChanged)以及节点路径封装成一个WatchedEvent对象

    •         查询Watcher

    •         从WatchTable中根据节点路径查找Watcher

    •         没找到;说明没有客户端在该数据节点上注册过Watcher

    •         找到;提取并从WatchTable和Watch2Paths中删除对应Watcher(从这里可以看出Watcher在服务端是一次性的,触发一次就失效了)


3.调用process方法来触发Watcher

这里process主要就是通过ServerCnxn对应的TCP连接发送Watcher事件通知。


标签: 客户端ZookeeperWatcher服务端