zookeeper - watcher(9)

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: watcher的特征    zookeeper的一大特点之一就是watch机制,所有基于zookeeper的消息通知机制基本上都是建议在watcher机制之上的,比如业界比较有名的由360公司开源的Qconf的底层就是基于这个实现的,本章其实就是想将zookeeper的watcher的数据存储、watcher的添加、watcher的触发整个过程讲解清楚,方便大家有个清晰的认识。

watcher的特征

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

img_c702f7333a8a56c5b193e4a115baa9fd.png
watch特性


watcher的存储

img_bb2df0ece660b1fb74e2151b626ad3f5.png
watcher的存储

说明:

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


img_bf73731f4eea84b0984a136b495d1e06.png
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动作。

img_8705a5a5dc1ab94469ebc5cbef8c8d12.png
watcher的添加方式

exists添加watcher

img_382776fd1eeb89f4536b007a852041b3.png
exists的watcher

说明:

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


getData添加watcher

img_1a78bc1c087ad1c145bc2df9f9b68552.png
getData的watcher

说明:

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


getChildren添加watcher

img_a0f7dd7d1f9a98af6a4691dbaa2711a2.png
getChildren的watcher

说明:

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


watcher添加过程

img_fa3391acbbdaee4258a7e3486d1fc6d3.png
数据流入口

说明:

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


watcher的触发

img_0bee29fb25065ba8ce7c86424b7028a3.png
watcher触发后动作

说明:

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


img_1e2303e07cf109327ed3d7cd3a35b26e.png
触发watcher的动作

说明:

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



img_e7061fd22e0c3a9e236b853a733bc591.png
同时触发dataWatches和childWatches

说明:

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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
7月前
|
监控 NoSQL Java
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
|
4月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
77 1
|
4月前
|
分布式计算 Hadoop Unix
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
72 1
|
6月前
|
监控 API
【zookeeper 第四篇章】监控 Watcher
ZooKeeper通过Watcher机制实现了数据的发布/订阅功能。多个订阅者可以监听同一主题对象,一旦该对象状态变化,如节点内容或子节点列表变动,ZooKeeper会实时通知所有订阅者。Watcher架构包括ZooKeeper服务端、客户端及其Watcher管理器。客户端向服务端注册Watcher并保存至本地管理器中;当状态变化时,服务端通知客户端,触发相关Watcher回调处理逻辑。
150 2
|
9月前
|
存储 API
深入理解Zookeeper系列-4.Watcher原理
深入理解Zookeeper系列-4.Watcher原理
73 1
|
算法
Zookeeper 的读写机制、保证机制、Watcher(数据变更的通知)
Zookeeper 的读写机制、保证机制、Watcher(数据变更的通知)
209 0
|
Go 数据安全/隐私保护 微服务
48-微服务技术栈(高级):分布式协调服务zookeeper源码篇(Watcher机制-3[Zookeeper])
  前面已经分析了Watcher机制中的大多数类,本篇对于ZKWatchManager的外部类Zookeeper进行分析。
187 0
|
微服务
46-微服务技术栈(高级):分布式协调服务zookeeper源码篇(Watcher机制-1)
  前面已经分析了Zookeeper持久话相关的类,下面接着分析Zookeeper中的Watcher机制所涉及到的类。
109 0
|
缓存 安全 微服务
47-微服务技术栈(高级):分布式协调服务zookeeper源码篇(Watcher机制-2[WatchManager])
前面已经分析了Watcher机制中的第一部分,即在org.apache.zookeeper下的相关类,接着来分析org.apache.zookeeper.server下的WatchManager类。
170 0
|
存储 监控
今日整理-Zookeeper 的 Watcher 机制,有哪些特性?
今日整理-Zookeeper 的 Watcher 机制,有哪些特性?
170 2

热门文章

最新文章