Zookeeper系列(二)——Zookeeper的Watch机制

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Zookeeper系列(二)——Zookeeper的Watch机制

概述


zookeeper 中提供类似unix文件结构的数据模型,每个节点分为永久节点和临时节点。现在讲另外一个关键技术—Zookeeper的Watch机制, 可以实现分布式的数据的发布/订阅功能。

一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当主题对象发生变化时,会通知所有的订阅者。在日常生活中有很多发布订阅的场景,比如我们在购物网站购物时,发现一个喜欢的商品,但是商品的价格太高了,通常网站会提供降价通知的功能,我们开启该功能后,商品降价就会通知到我们。

利用Zookeeper的监听机制和数据模型的特点,可以实现分布式锁的功能。

系列文章见Zookeeper系列笔记,带你入门到精通


Watch机制如何实现


整个watch机制类似我们的观察者模式,Zookeeper允许客户端像服务端注册一个Watcher监听,当服务端的一些事件触发了这个Watcher,那么就会向指定的客户端发送一个事件通知来实现分布式通知功能。

  1. 创建ZooKeeper客户端的时候,会创建两个线程,一个负责网络通信(send线程),另外一个负责监听(event线程)。
  2. 通过send线程将Watcher注册到Zookeeper服务端,同时Watcher对象保存到客户端的watch管理器中。
  3. Zookeper上的数据或者路径发生变化, 通过event线程异步通知给客户端。
  4. Zookeeper客户端的 Watch管理器会触发相关 Watcher来回调相应处理逻辑。

1671115146723.jpg


Watch机制的特点


一次性触发

数据或者路径发生变化,zookeeper会产生一个watcher事件,发送给注册监听的客户端,客户端只会接收到一次通知,如果数据还发生变化,客户端不会再收到通知。

先注册再触发

Zookeeper 中的 watch 机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。

异步发送

watcher事件发送到客户端时采用异步发送的,有专门的一个linster线程。

客户端串行执行

客户端 Watcher 回调的过程是一个串行同步的过程,这为我们保证了顺序,同时,需要开发人员注意的一点是,千万不要因为一个 Watcher 的处理逻辑影响了整个客户端的 Watcher 回调。

时效性

watcher只有在当前session彻底失效时才会无效,若在session有效期内快速重连成功,则watcher依然存在,仍可接收到通知。

轻量

Zookeper使用WatchedEvent对象来封装事件对象,这个数据结构中只包含三部分内容:通知状态、事件类型和节点路径。也就是说,Watcher 通知非常简单,只会告诉客户端发生了事件,而不会说明事件的具体内容。例如针对 NodeDataChanged 事件,ZooKeeper 的 Watcher 只会通知客户端指定数据节点的数据内容发生了变更,而对于原始数据以及变更后的新数据都无法从这个事件中直接获取到,而是需要客户端主动重新去获取数据。这也是ZooKeeper 的 Watcher机制的一个非常重要的特性。


通知状态和事件类型


前面讲了WatchedEvent事件包含3部分内容,通知状态(KeeperState)、事件类型(EventType)和节点路径。同一个事件类型在不同的通知状态中代表的含义有所不同,下表列举了常见的通知状态和事件类型。

KeeperState EventType 触发条件 说明
SyncConnected(0) None(-1) 客户端与服务端成功建立连接
NodeCreated(1) Watcher 监听的对应数据节点被创建
NodeDeleted(2) Watcher 监听的对应数据节点被删除
NodeDataChanged(3) Watcher 监听的对应数据节点的数据内容发生变更
NodeChildChanged(4) Wather 监听的对应数据节点的子节点列表发生变更
Disconnected(0) None(-1) 客户端与ZooKeeper 服务器断开连接 此时客户端和服务器处于断开连接状态
Expired(-112) None(-1) 会话超时 此时客户端会话失效,通常同时也会收到SessionExpiredException 异常
AuthFailed(4) None(-1) 通常有两种情况,1:使用错误的schema 进行权限检查2:SASL 权限检查失败 通常同时也会收到AuthFailedException 异常


Shell验证Watcher


下面的两钟情况是常见的监听方式:

1). 监听节点数据的变化, get path [watch]

2). 监听子节点增减的变化, ls path [watch]

  1. 设置节点数据变动监听

1671115169614.jpg

  1. 启动另外一个session,修改alvin节点的数据。

网络异常,图片无法展示
|

  1. 收到监听

1671115189690.jpg

  1. 再次修改数据

1671115196994.jpg

  1. 未收到监听,验证了一次触发

1671115204293.jpg

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
2月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
43 1
|
2月前
|
分布式计算 Hadoop Unix
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
45 1
|
5月前
|
存储 数据库
zookeeper 集群环境搭建及集群选举及数据同步机制
zookeeper 集群环境搭建及集群选举及数据同步机制
76 2
|
7月前
|
网络协议 中间件 数据库
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
272 0
|
7月前
|
Java API 开发者
深入浅出Zookeeper源码(四):Watch实现剖析
用过zookeeper的同学都知道watch是一个非常好用的机制,今天我们就来看看它的实现原理。 在正文开始前,我们先来简单回忆一下watch是什么? zk提供了分布式数据的发布/订阅功能——即典型的发布订阅模型,其定义了一种一对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态变化时,则会通知所有订阅者。具体来说,则是zk允许一个客户端向服务端注册一个watch监听,当服务端的一些指定事件触发了这个watch,那么就会向该客户端发送事件通知。
111 0
|
消息中间件 存储 分布式计算
消息队列kafka及zookeeper机制
消息队列kafka及zookeeper机制
182 1
|
算法
Zookeeper 的读写机制、保证机制、Watcher(数据变更的通知)
Zookeeper 的读写机制、保证机制、Watcher(数据变更的通知)
158 0
|
Go 数据安全/隐私保护 微服务
48-微服务技术栈(高级):分布式协调服务zookeeper源码篇(Watcher机制-3[Zookeeper])
  前面已经分析了Watcher机制中的大多数类,本篇对于ZKWatchManager的外部类Zookeeper进行分析。
157 0
|
微服务
46-微服务技术栈(高级):分布式协调服务zookeeper源码篇(Watcher机制-1)
  前面已经分析了Zookeeper持久话相关的类,下面接着分析Zookeeper中的Watcher机制所涉及到的类。
97 0
|
存储 设计模式 监控
Apache ZooKeeper - Watch 机制的底层原理
Apache ZooKeeper - Watch 机制的底层原理
149 0