watcher的特征

zookeeper的一大特点之一就是watch机制,所有基于zookeeper的消息通知机制基本上都是建议在watcher机制之上的,比如业界比较有名的由360公司开源的Qconf的底层就是基于这个实现的,本章其实就是想将zookeeper的watcher的数据存储、watcher的添加、watcher的触发整个过程讲解清楚,方便大家有个清晰的认识。

watch特性

watcher的存储

watcher的存储

说明:

watcher主要分为dataWatches和childWatches,其中dataWatches是保存节点层面的watcher对象的,childWatches是保存子节点层面的watcher对象的。核心的点在于WatchManager数据结构。

watcher的保存结构

说明:

WatchManager内部主要维持了watchTable(path->watcher)以及watch2Paths(watcher->path)两个映射关系,其实这也就是代表了一个path有多个watcher,或一个watcher同时watch了多个path的场景。

整个watcher的添加过程其实同时需要修改watchTable和watch2Paths两个map对象,具体的修改操作可以参考上面的代码贴图。

watcher的添加

zookeeper的watcher的添加一般通过三个途径,分别是通过existsgetDatagetChildren三种方式添加,其中exists用于判断节点是否存在,getData获取节点数据,getChildren获取子节点。其实从这个地方我们可以看出来其实watcher的添加其实是附加动作,基本上都是在主动作的同时添加一下watcher。

从下面的API我们其实就看出来了,对应上面提到的3个动作提供3个接口用于添加watcher动作。

watcher的添加方式

exists添加watcher

exists的watcher

说明:

直观的感受就是我们在执行exists的api的时候,我们最终通过statNode的接口保存了watcher,注意这里保存在dataWatches当中

getData添加watcher

getData的watcher

说明:

直观的感受就是我们再执行getData的时候,我们最终通过addWatch的接口保存了watcher,注意这里保存在dataWatches当中

getChildren添加watcher

getChildren的watcher

说明:

直观的感受就是我们再执行getData的时候,我们最终通过addWatch的接口保存了watcher,注意这里的保存在childWatches当中

watcher添加过程

数据流入口

说明:

其实数据是在FinalRequestProcessor当中进行写入的,根据OpCode执行的写入操作,所以基本上我认为通过这个图基本上能够了解到watcher写入的入口了。

watcher的触发

watcher触发后动作

说明:

从这里我们可以看出来并且印证一个观点,那就是watcher是一次性触发的,原因就在于每次我们triggerWatch的时候我们都会把watcher从watchTable当中移除,根据具体触发的path路径找到对应的watcher,然后移除watcher并触发watcher的后续动作。注意这里触发了watcher。

触发watcher的动作

说明:

从这里我们可以看出来,触发watcher的几个动作主要包括创建节点(createNode)、删除节点(deleteNode)、数据变更(setData)。

同时触发dataWatches和childWatches

说明:

从上图可以看出来我们在创建节点的时候会同时判断是否触发dataWatches和childWatches,这也就解释了childWatches是如何被触发的。

zookeeper - watcher(9)相关推荐

  1. ZooKeeper系列(三)

    前面虽然配置了集群模式的Zookeeper,但是为了方面学建议在伪分布式模式的Zookeeper学习Zookeeper的shell命令. 一.Zookeeper的四字命令 Zookeeper支持某些特 ...

  2. zookeeper原理(转)

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...

  3. Zookeeper系列(二)、核心原理

    上一篇我们介绍了Zookeeper的一些基础知识,本篇来讲解zk内部的一些核心原理,帮助我们更好的理解zk的工作机制. 目录 选举机制 Leader选举流程 Leader选举原理 Watch机制 会话 ...

  4. zookeeper系列(二)实战master选举

    2019独角兽企业重金招聘Python工程师标准>>> master选举 考虑7*24小时向外提供服务的系统,不能有单点故障,于是我们使用集群,采用的是Master+Slave.集群 ...

  5. zookeeper系列(二)实战master选举 1

    zookeeper系列(一)zookeeper必知 zookeeper系列(二)实战master选举 zookeeper系列(三)实战数据发布订阅 zookeeper系列(四)实战负载均衡 zooke ...

  6. zookeeper使用(三):项目中zookeeper的配置 和 zookeeper C API的使用

    zookeeper使用(三):项目中zookeeper的配置 和 zookeeper C API的使用 一:假定一个项目需求 假设我要启动多台proxy服务,有一个网页客户端需要连接我这台proxy服 ...

  7. Zookeeper Watcher(事件监听器)?

    Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性.ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会 ...

  8. ZooKeeper入门(三)zookeeper的Watcher机制

    process方法是Watcher接口中的一个回调方法,当ZooKeeper向客户端发送一个Watcher事件通知时,客户端就会对相应的process方法进行回调,从而实现对事件的处理. import ...

  9. zookeeper系列(九)zookeeper的会话详解

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6103870.html尊重原创,大家共同学习: 一.前言 ...

最新文章

  1. 计算机四级网络工程师考试重点
  2. java后期发展方向_2020年前3季度工程自卸车市场咋样?后期朝啥方向发展?
  3. go语言实现第一个程序-hello,world!
  4. 信号与系统 chapter13 阶跃响应的定义与求法
  5. margin折叠-从子元素margin-top影响父元素引出的问题
  6. php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?
  7. 高德地图-2D地图下区域遮掩(只显示固定区域里的内容)
  8. java jstack 工具_java命令之jstack工具
  9. codevs——2822 爱在心中
  10. 飘云阁(PYG)番茄插件 弹窗清除
  11. 智能运维发展史及核心技术研究
  12. 广告管理系统-数据库表设计
  13. [Unity][AssetBundle]本地其他项目AB包加载AB打包文件文件路径
  14. 【手拉手 带你准备电赛】使用定时器中断更改PWM占空比
  15. 网站建设需要学什么?
  16. 谷歌语音合成_如何修改Google语音合成语音
  17. error: failed to push some refs to ‘xx.git‘ hint: Updates were rejected because the tip of your curr
  18. mysql CPU占用过高解决方案
  19. 专利申请怎样做快速预审?
  20. js实现搜索框智能搜索提示,类似百度搜索

热门文章

  1. iPhone地图 实战iPhone GPS定位系统
  2. 基于Springboot开发的家庭财务管理系统
  3. oracle 数据库创建表
  4. 团队冲刺第二阶段-2
  5. Mysql数据类型(二)
  6. jemter编写Mysql脚本___传参
  7. 6、linux网络编程--UDP协议编程
  8. 剑指offer4:重建二叉树
  9. 转Python 标准库 urllib2 的使用细节
  10. .NET 开发环境中使用VSN版本控制