zookeeper watch 实现原理笔记

zk三种注册监听方式:getData(),exists,getChildren。

客户端发送的监听请求会放到队列中(outgoingQueue),队列会有一个 sendThread 处理,sendThread 通过发送 path 路径和 watcher 为 true ,到 server 注册 watch 事件。

zk服务端会有一个 WatchManger 该类中有 HashMap> watchTable ,key为path , Watcher 是一个客户端网络连接封装,当节点变化时会通知对应的连接(连接通过心跳保持)。

客户端发送完后本地会有一个 ZKwatcherManager 类,该类中保存了 Map> dataWatchers、Map> existsWatchers、Map> childrenWatchers 三个集合,客户端会在 dataWatchers 中会添加一个 key 为 path 路径的本地事件。

当服务端节点变化时会从 watchTable 中拿到对应 path 的 Watcher 集合通知到客户端,通知完后就会删除改连接,客户端根据返回结果中的 path 拿到 dataWatchers 中的本地事件进行调用。

因为服务端已经把链接删除,如果客户端想要继续监听该节点需要再次发起监听请求。

你可能感兴趣的:(zookeeper,Java)