点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖
💻 Java篇正式开启!(300篇)
目前2025年07月02日更新到: Java-61 深入浅出 分布式服务 一致性算法 Raft 多图详解 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
章节内容
上节我们完成了:
- ZNode的基本介绍
- ZNode节点类型的介绍
- 事务ID的介绍
- ZNode实机测试效果
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。
- 2C4G 编号 h121
- 2C4G 编号 h122
- 2C2G 编号 h123
Wacher 机制详解
基本概念
ZooKeeper
使用Watcher机制
实现分布式
数据的发布/订阅
功能。这种机制是ZooKeeper实现分布式协调服务的核心组件之一,它允许客户端对ZooKeeper节点(znode)的变化进行监听。
发布/订阅模型详解
一个典型的发布/订阅
模型定义了一对多
的订阅关系,能够让多个订阅者
同时监听
某一个主题
对象(在ZooKeeper中表现为znode节点)。这种模型具有以下特点:
- 多客户端监听:多个客户端可以同时注册监听同一个znode节点
- 事件驱动:当被监听的znode节点发生以下变化时,会触发事件通知:
- 节点数据变更(DataChanged)
- 子节点列表变更(ChildrenChanged)
- 节点创建/删除(NodeCreated/NodeDeleted)
- 一次性通知:默认情况下,Watcher是一次性的,事件触发后需要重新注册
工作机制流程
- 注册监听:客户端通过调用
getData()
、exists()
或getChildren()
等方法时设置Watcher - 事件触发:当被监听的znode发生相应变化时,ZooKeeper服务器会生成事件
- 通知发送:服务器将事件通过Watcher回调通知客户端
- 回调处理:客户端接收到事件后执行预定义的处理逻辑
应用场景示例
- 配置中心:多个服务监听配置节点,配置变更时所有服务自动更新
- 集群管理:监听节点存活状态,实现故障检测和自动恢复
- 分布式锁:监听锁节点变化,实现锁释放通知
- 领导者选举:监听领导节点变化,实现故障转移
性能特点
- 轻量级:通知仅包含事件类型和节点路径,不包含具体数据
- 顺序保证:所有Watcher通知按事件发生的先后顺序发送
- 可靠性:通知能保证被送达,但可能因网络问题延迟# Wacher 机制详解
基本概念
ZooKeeper
使用Watcher机制
实现分布式
数据的发布/订阅
功能。这种机制是ZooKeeper实现分布式协调服务的核心组件之一,它允许客户端对ZooKeeper节点(znode)的变化进行监听。
发布/订阅模型详解
一个典型的发布/订阅
模型定义了一对多
的订阅关系,能够让多个订阅者
同时监听
某一个主题
对象(在ZooKeeper中表现为znode节点)。这种模型具有以下特点:
- 多客户端监听:多个客户端可以同时注册监听同一个znode节点
- 事件驱动:当被监听的znode节点发生以下变化时,会触发事件通知:
- 节点数据变更(DataChanged)
- 子节点列表变更(ChildrenChanged)
- 节点创建/删除(NodeCreated/NodeDeleted)
- 一次性通知:默认情况下,Watcher是一次性的,事件触发后需要重新注册
工作机制流程
- 注册监听:客户端通过调用
getData()
、exists()
或getChildren()
等方法时设置Watcher - 事件触发:当被监听的znode发生相应变化时,ZooKeeper服务器会生成事件
- 通知发送:服务器将事件通过Watcher回调通知客户端
- 回调处理:客户端接收到事件后执行预定义的处理逻辑
应用场景示例
- 配置中心:多个服务监听配置节点,配置变更时所有服务自动更新
- 集群管理:监听节点存活状态,实现故障检测和自动恢复
- 分布式锁:监听锁节点变化,实现锁释放通知
- 领导者选举:监听领导节点变化,实现故障转移
性能特点
- 轻量级:通知仅包含事件类型和节点路径,不包含具体数据
- 顺序保证:所有Watcher通知按事件发生的先后顺序发送
- 可靠性:通知能保证被送达,但可能因网络问题延迟
ZooKeeper 的 Watcher 机制主要包括:
- 客户端线程
- 客户端 Watcher Manager
- ZooKeeper服务器
Watcher 机制的工作原理
注册节点
客户端可以在读取或获取某个节点的数据时,选择注册一个 Watcher 来监听节点的变化。ZooKeeper 提供了多种 API 方法来注册 Watcher:
getData(path, watch)
- 监听指定节点的数据变更getChildren(path, watch)
- 监听指定节点的子节点变更exists(path, watch)
- 监听指定节点的创建/删除事件
注册 Watcher 的具体流程如下:
- 客户端调用上述方法时,如果 watch 参数设为 true,会向 ZooKeeper 服务器发送一个注册请求
- 服务器收到请求后,会将这个 Watcher 记录在相应节点的 Watcher 列表中
- 服务器会为每个 Watcher 维护一个会话 ID,确保只有注册该 Watcher 的客户端才能收到通知
例如,在分布式配置系统中,客户端可以使用 getData("/config", true)
来注册一个 Watcher,以便在配置变更时及时获取最新配置。
触发节点
当被监听的节点发生以下变化时,ZooKeeper 服务器会触发相应节点上的 Watcher:
- 数据变更:节点数据被修改(setData)
- 节点创建:指定路径的节点被创建
- 节点删除:指定路径的节点被删除
- 子节点变更:节点的子节点数量发生变化(新增或删除)
需要注意的重要特性:
- Watcher 触发是一次性的,触发后即失效
- 如果客户端需要继续监听,必须在收到通知后重新注册
- 多个客户端可以同时注册同一个节点的 Watcher
- Watcher 触发是有序的,确保客户端看到的状态变化是有序的
在实际应用中,这种一次性机制可以防止因大量事件通知导致的网络拥塞,同时也要求客户端正确处理重新注册的逻辑。
进行通知
当 Watcher 被触发后,ZooKeeper 会向客户端发送一个 WatchedEvent 通知,通知包含以下关键信息:
- 事件类型:
- NodeCreated (节点创建)
- NodeDeleted (节点删除)
- NodeDataChanged (数据变更)
- NodeChildrenChanged (子节点变更)
- 节点路径:发生变化的节点完整路径
客户端处理流程通常包括:
-
接收事件通知,解析事件类型和节点路径
-
根据业务需求采取相应行动,例如:
- 重新获取节点数据
- 重建监听
- 更新本地缓存
- 触发后续业务流程
-
如果需要继续监听,重新调用 getData/getChildren/exists 方法注册新的 Watcher
典型应用场景:
- 配置中心:配置变更时通知所有客户端
- 集群管理:节点上下线时通知管理节点
- 分布式锁:锁释放时通知等待的客户端
- 服务发现:服务注册信息变更时通知消费者## 注册节点
客户端可以在读取或获取某个节点的数据时,选择注册一个 Watcher 来监听节点的变化。ZooKeeper 提供了多种 API 方法来注册 Watcher:
getData(path, watch)
- 监听指定节点的数据变更getChildren(path, watch)
- 监听指定节点的子节点变更exists(path, watch)
- 监听指定节点的创建/删除事件
注册 Watcher 的具体流程如下:
- 客户端调用上述方法时,如果 watch 参数设为 true,会向 ZooKeeper 服务器发送一个注册请求
- 服务器收到请求后,会将这个 Watcher 记录在相应节点的 Watcher 列表中
- 服务器会为每个 Watcher 维护一个会话 ID,确保只有注册该 Watcher 的客户端才能收到通知
例如,在分布式配置系统中,客户端可以使用 getData("/config", true)
来注册一个 Watcher,以便在配置变更时及时获取最新配置。
触发节点
当被监听的节点发生以下变化时,ZooKeeper 服务器会触发相应节点上的 Watcher:
- 数据变更:节点数据被修改(setData)
- 节点创建:指定路径的节点被创建
- 节点删除:指定路径的节点被删除
- 子节点变更:节点的子节点数量发生变化(新增或删除)
需要注意的重要特性:
- Watcher 触发是一次性的,触发后即失效
- 如果客户端需要继续监听,必须在收到通知后重新注册
- 多个客户端可以同时注册同一个节点的 Watcher
- Watcher 触发是有序的,确保客户端看到的状态变化是有序的
在实际应用中,这种一次性机制可以防止因大量事件通知导致的网络拥塞,同时也要求客户端正确处理重新注册的逻辑。
进行通知
当 Watcher 被触发后,ZooKeeper 会向客户端发送一个 WatchedEvent 通知,通知包含以下关键信息:
- 事件类型:
- NodeCreated (节点创建)
- NodeDeleted (节点删除)
- NodeDataChanged (数据变更)
- NodeChildrenChanged (子节点变更)
- 节点路径:发生变化的节点完整路径
客户端处理流程通常包括:
-
接收事件通知,解析事件类型和节点路径
-
根据业务需求采取相应行动,例如:
- 重新获取节点数据
- 重建监听
- 更新本地缓存
- 触发后续业务流程
-
如果需要继续监听,重新调用 getData/getChildren/exists 方法注册新的 Watcher
典型应用场景:
- 配置中心:配置变更时通知所有客户端
- 集群管理:节点上下线时通知管理节点
- 分布式锁:锁释放时通知等待的客户端
- 服务发现:服务注册信息变更时通知消费者
Watcher特点
一次性
:Watcher 机制是一次性的,客户端需要在每次事件发生后重新注册 Watcher 以继续监视节点。异步通知
:Watcher 事件是异步通知的,这意味着客户端注册 Watcher 后不会阻塞等待事件的发生,而是通过事件通知机制处理事件。轻量级
:Watcher 是轻量级的,不会对 ZooKeeper 服务器带来显著的性能负担。
Watcher 使用场景
配置管理
:在分布式系统中,多个服务可能依赖同一个配置。通过 Watcher 机制,可以实现配置的动态更新,当配置变更时,所有依赖该配置的服务都能及时收到通知并进行更新。服务发现
:在服务发现机制中,客户端可以通过 Watcher 监视服务节点的变化,当有新服务加入或服务下线时,客户端能够及时感知并更新服务列表。分布式锁
:在实现分布式锁时,可以使用 Watcher 机制监控锁节点的状态,当锁被释放时,等待的客户端可以收到通知并尝试获取锁。
创建节点
永久节点
create /wzk 123456
顺序节点
create -s /wzk-order 654321
临时节点
create -e /wzk-temp 123123
读取节点
列出节点
ls /
查看数据
get /wzk
更新节点
set /wzk-temp 111222
删除节点
delete /wzk-temp