zookeeper - watcher(9)
watcher的特征
zookeeper的一大特点之一就是watch机制,所有基于zookeeper的消息通知机制基本上都是建议在watcher机制之上的,比如业界比较有名的由360公司开源的Qconf的底层就是基于这个实现的,本章其实就是想将zookeeper的watcher的数据存储、watcher的添加、watcher的触发整个过程讲解清楚,方便大家有个清晰的认识。
watcher的存储
说明:
watcher主要分为dataWatches和childWatches,其中dataWatches是保存节点层面的watcher对象的,childWatches是保存子节点层面的watcher对象的。核心的点在于WatchManager数据结构。
说明:
WatchManager内部主要维持了watchTable(path->watcher)以及watch2Paths(watcher->path)两个映射关系,其实这也就是代表了一个path有多个watcher,或一个watcher同时watch了多个path的场景。
整个watcher的添加过程其实同时需要修改watchTable和watch2Paths两个map对象,具体的修改操作可以参考上面的代码贴图。
watcher的添加
zookeeper的watcher的添加一般通过三个途径,分别是通过exists、getData、getChildren三种方式添加,其中exists用于判断节点是否存在,getData获取节点数据,getChildren获取子节点。其实从这个地方我们可以看出来其实watcher的添加其实是附加动作,基本上都是在主动作的同时添加一下watcher。
从下面的API我们其实就看出来了,对应上面提到的3个动作提供3个接口用于添加watcher动作。
exists添加watcher
说明:
直观的感受就是我们在执行exists的api的时候,我们最终通过statNode的接口保存了watcher,注意这里保存在dataWatches当中。
getData添加watcher
说明:
直观的感受就是我们再执行getData的时候,我们最终通过addWatch的接口保存了watcher,注意这里保存在dataWatches当中。
getChildren添加watcher
说明:
直观的感受就是我们再执行getData的时候,我们最终通过addWatch的接口保存了watcher,注意这里的保存在childWatches当中。
watcher添加过程
说明:
其实数据是在FinalRequestProcessor当中进行写入的,根据OpCode执行的写入操作,所以基本上我认为通过这个图基本上能够了解到watcher写入的入口了。
watcher的触发
说明:
从这里我们可以看出来并且印证一个观点,那就是watcher是一次性触发的,原因就在于每次我们triggerWatch的时候我们都会把watcher从watchTable当中移除,根据具体触发的path路径找到对应的watcher,然后移除watcher并触发watcher的后续动作。注意这里触发了watcher。
说明:
从这里我们可以看出来,触发watcher的几个动作主要包括创建节点(createNode)、删除节点(deleteNode)、数据变更(setData)。
说明:
从上图可以看出来我们在创建节点的时候会同时判断是否触发dataWatches和childWatches,这也就解释了childWatches是如何被触发的。
zookeeper - watcher(9)相关推荐
- ZooKeeper系列(三)
前面虽然配置了集群模式的Zookeeper,但是为了方面学建议在伪分布式模式的Zookeeper学习Zookeeper的shell命令. 一.Zookeeper的四字命令 Zookeeper支持某些特 ...
- zookeeper原理(转)
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...
- Zookeeper系列(二)、核心原理
上一篇我们介绍了Zookeeper的一些基础知识,本篇来讲解zk内部的一些核心原理,帮助我们更好的理解zk的工作机制. 目录 选举机制 Leader选举流程 Leader选举原理 Watch机制 会话 ...
- zookeeper系列(二)实战master选举
2019独角兽企业重金招聘Python工程师标准>>> master选举 考虑7*24小时向外提供服务的系统,不能有单点故障,于是我们使用集群,采用的是Master+Slave.集群 ...
- zookeeper系列(二)实战master选举 1
zookeeper系列(一)zookeeper必知 zookeeper系列(二)实战master选举 zookeeper系列(三)实战数据发布订阅 zookeeper系列(四)实战负载均衡 zooke ...
- zookeeper使用(三):项目中zookeeper的配置 和 zookeeper C API的使用
zookeeper使用(三):项目中zookeeper的配置 和 zookeeper C API的使用 一:假定一个项目需求 假设我要启动多台proxy服务,有一个网页客户端需要连接我这台proxy服 ...
- Zookeeper Watcher(事件监听器)?
Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性.ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会 ...
- ZooKeeper入门(三)zookeeper的Watcher机制
process方法是Watcher接口中的一个回调方法,当ZooKeeper向客户端发送一个Watcher事件通知时,客户端就会对相应的process方法进行回调,从而实现对事件的处理. import ...
- zookeeper系列(九)zookeeper的会话详解
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6103870.html尊重原创,大家共同学习: 一.前言 ...
最新文章
- 计算机四级网络工程师考试重点
- java后期发展方向_2020年前3季度工程自卸车市场咋样?后期朝啥方向发展?
- go语言实现第一个程序-hello,world!
- 信号与系统 chapter13 阶跃响应的定义与求法
- margin折叠-从子元素margin-top影响父元素引出的问题
- php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?
- 高德地图-2D地图下区域遮掩(只显示固定区域里的内容)
- java jstack 工具_java命令之jstack工具
- codevs——2822 爱在心中
- 飘云阁(PYG)番茄插件 弹窗清除
- 智能运维发展史及核心技术研究
- 广告管理系统-数据库表设计
- [Unity][AssetBundle]本地其他项目AB包加载AB打包文件文件路径
- 【手拉手 带你准备电赛】使用定时器中断更改PWM占空比
- 网站建设需要学什么?
- 谷歌语音合成_如何修改Google语音合成语音
- error: failed to push some refs to ‘xx.git‘ hint: Updates were rejected because the tip of your curr
- mysql CPU占用过高解决方案
- 专利申请怎样做快速预审?
- js实现搜索框智能搜索提示,类似百度搜索