zookeeper watch 实现原理笔记

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值