ZK-watch机制

客户端注册

  1. 在创建一个 ZooKeeper 客户端对象实例时,可以向构造方法中传入一个默认的 Watcher。并向服务端发送请求
  2. 完成请求发送后,会由客户端 SendTread 线程的 readResponse 方法负责接收来自服务端的响应,
  3. 把 WatchRegistration 子类里面的 Watcher 实例放到 ZKWatchManager 的 dataWatches 中存储起来

服务端触发

  1. 封装WatchedEvent; 首先将通知状态(KeeperState),事件类型(EventType)以及节点路径(path)封装成WatchedEvent。
  2. 查询Watcher,根据数据节点的路径从watchTable中取出对应的watcher,如果没有,说明没有注册watcher。如果找到这个watcher,将其提取出来,同时会直接从watchTable和watch2Paths中将其删除。watcher在server端是一次性的。
  3. 调用process触发watcher。逐个调用触发;zk会把当前请求的ServerCnxn作为一个Watcher进行存储。

客户端回调watch

  1. 反序列化
  2. 还原 WatchedEvent
  3. 别出事件类型 EventType 后,会从相应的 Watcher 存储(即 dataWatches、existWatches 或 childWatches 中的一个或多个)中去除对应的 Watcher
  4. 取到所有的 Watcher 后,放到 waitingEvents 里面(单向链表)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值