- 为什么添加Watch
ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建更多复杂的分布式协调功能。
多个分布式进程通过ZooKeeper提供的API来操作共享的ZooKeeper内存数据对象ZNode来达成某种一致的行为或结果,这种模式本质上是基于状态共享的并发模型,与Java的多线程并发模型一致,他们的线程或进程都是”共享式内存通信“。Java没有直接提供某种响应式通知接口来监控某个对象状态的变化,只能要么浪费CPU时间毫无响应式的轮询重试,或基于Java提供的某种主动通知(Notif)机制(内置队列)来响应状态变化,但这种机制是需要循环阻塞调用。而ZooKeeper实现这些分布式进程的状态(ZNode的Data、Children)共享时,基于性能的考虑采用了类似的异步非阻塞的主动通知模式即Watch机制,使得分布式进程之间的“共享状态通信”更加实时高效,其实这也是ZooKeeper的主要任务决定的—协调。Consul虽然也实现了Watch机制,但它是阻塞的长轮询。
- ZooKeeper VS JVM
从某种角度来说,可以这样对比(个人看法,可以讨论),ZooKeeper对等于JVM,ZooKeeper包含状态对象(ZNode)和分布式进程的底层执行引擎Zab,而JVM内部包含堆(多线程共享的大量对象存放区域)和多线程执行正确性约束规范JMM(Java内存模型),JMM确保了多线程的执行顺序是正确的。Zab协议使得ZooKeeper的内部修改状态操作直接是有序串行的,而JVM内部则是乱序并行的,需要添加额外的机制才能保证时序(内存屏障、处理器原子指令),而状态读取时,JVM和ZooKeeper都存在直接读取时读到旧数据,但ZooKeeper有Watch机制使得响应式读取更高效,而JVM只能使用底层的内存屏障刷新共享状态,以便其他线程再次读取时获得正确的新数据。
ZooKeeper提供的接口使得所有的分布式进程的执行都是异步非阻塞的(WaitFree算法),内部是基于Version的CAS操作,而JVM提供了阻塞的和非阻塞的多种接口,有Synchronized、Volatile、AtomicOperations。基于接口之上构建线程或分布式进程之间更复杂的同步或协调功能时,Java并发库直接提供了闭锁、循环栅栏、信号量等同步工具以及基础的抽象队列同步器,而ZooKeeper则需要用户基于接口自行构建各种分布式协调功能(分布式锁、分布式发布订阅、集群成员关系管理)。如下图:
ZooKeeper | JVM | |
共享状态对象 | ZNode | 堆中对象 |
底层执行模式 | Zab顺序执行 | 多处理器并发执行(内存屏障、原子机器指令) |
API接口 | Get、Watch_Get、Cas_Set、Exist | Synchronized、volatile、final、Atomic |
协调或同步功能 | 分布式发布订阅、锁、读写锁 | 并发库同步工具、基于抽象队列同步器构建的同步组件 |
- ZooKeeper的Watch架构
Watch的整体流程如下图所示,客户端先向ZooKeeper服务端成功注册想要监听的节点状态,同时客户端本地会存储该监听器相关的信息在WatchManager中,当ZooKeeper服务端监听的数据状态发生变化时,ZooKeeper就会主动通知发送相应事件信息给相关会话客户端,客户端就会在本地响应式的回调相关Watcher的Handler。
- ZooKeeper的Watch特性
- Watch是一次性的,每次都需要重新注册,并且客户端在会话异常结束时不会收到任何通知,而快速重连接时仍不影响接收通知。
- Watch的回调执行都是顺序执行的,并且客户端在没有收到关注数据的变化事件通知之前是不会看到最新的数据,另外需要注意不要在Watch回调逻辑中阻塞整个客户端的Watch回调
- Watch是轻量级的,WatchEvent是最小的通信单元,结构上只包含通知状态、事件类型和节点路径。ZooKeeper服务端只会通知客户端发生了什么,并不会告诉具体内容。
- Watcher接口设计
如上图所示,Watch被设计成一个接口,任何实现了Watcher接口的类就是一个新的Watcher,Watcher内部包含2个枚举类,一个KeeperState,表示当事件发生时ZooKeeper的状态,另一个是事件发生的类型,主要分为2类(一类是ZNode内容的变化,另一类是ZNode子节点的变化),具体的描述见下表。
KeeperState |
EventType | TriggerCondition | EnableCalls | Desc |
SyncConnected (3)
|
None (-1) |
客户端与服务器成功建立会话 | 此时客户端与服务器处于连接状态 | |
同上 |
NodeCreated (1) |
Watcher监听的对应数据节点被创建 | Exists | 同上 |
同上 |
NodeDeleted (2) |
Watcher监听的对应数据节点被删除 | Exists, GetData, and GetChildren | 同上 |
同上 |
NodeDataChanged (3) |
Watcher监听的数据节点的数据内容和数据版本号发生变化 | Exists and GetData | 同上 |
同上 |
NodeChildrenChanged (4) |
Watcher监听的数据节点的子节点列表发生变化,子节点内容变化不会触发 | GetChildren | 同上 |
Disconnected (0) |
None (-1) |
客户端与ZooKeeper服务器断开连接 | 此时客户端与服务器处于断开连接的状态 | |
Expried (-112) |
None (-1) |
会话超时 | 此时客户端会话失效,通常同时也会收到SessionExpiredException异常 | |
AuthFailed (4) |
None (-1) |
通常有两种情况: 1.使用错误的scheme进行权限检查 2.SASL权限检查失败 |
收到AuthFailedException异常 |
- WatchEvent的设计
如上图所示,WatchEvent有2种表示模式,一种是逻辑表示即WatchedEvent,是直接封装了各种抽象的逻辑状态(KeeperState,EventType),适用于客户端和服务端各自内部处理,另一种是物理表示即封装的更多是底层基础的传输数据结构(int,String),并且实现了序列化接口,主要用来做底层的数据传输。
相关推荐
ZooKeeper Watch机制的理解 在 ZooKeeper 中,Watch 机制是一种异步非阻塞的主动通知模式,用于实现分布式进程之间的实时高效的状态共享。Watch 机制是 ZooKeeper 的核心机制之一,它使得分布式进程之间的“共享...
当一个Znode的数据发生变化时,Zookeeper会通过Watch机制通知已订阅该节点的客户端,实现了数据的实时同步。在这个项目中,Zookeeper可能被用来作为MySQL数据同步的状态协调器,记录每个节点的同步进度,确保在...
选举过程通过Zookeeper的Watch机制实时监控节点状态变化,并快速响应。 3. **配置管理**:Kafka的配置信息,如主题的创建、删除、分区数量的调整等,都需要通过Zookeeper进行同步。当这些配置变更发生时,Zookeeper...
DataMonitor 类使用 ZooKeeper 的 Watch 机制来监视 Znode 节点的数据,当 Znode 节点的数据发生变化时,DataMonitor 类会通知 Executor 类,并启动或停止可执行程序。 在 ZooKeeper 的应用程序设计中,开发人员...
8. **Watch机制**:Watch是Zookeeper的一种事件监听机制,客户端可以为任何节点设置Watch,当该节点发生变化时,Zookeeper会向设置Watch的客户端发送通知,实现数据变更的实时同步。 9. **安全性**:Zookeeper支持...
Watch 是 ZooKeeper 的一个重要特性,它允许客户端设置监听器(Watch)在特定 ZNode 上,当该 ZNode 发生改变(如数据更新、被删除或子节点变更)时,ZooKeeper 会向客户端发送一个事件通知。然而,Watch 是一次性...
2. **Watch机制**:Watch是Zookeeper的一个重要特性,允许客户端设置监听某个节点的变化,当节点数据变化或被删除时,Zookeeper会向设置了Watch的客户端发送通知。 3. **原子操作**:所有对Zookeeper的操作都是原子...
此外,Watch机制是Zookeeper的关键特性,客户端可以对节点设置Watch,当节点状态改变时,Zookeeper会向客户端发送一次性通知,从而实现事件驱动的通信。 Zookeeper的时间管理是通过Zxid(事务ID)来实现的,每个...
通过对ZooKeeper客户端初始化过程、与服务器间的交互逻辑、API调用方式、Watch机制以及容错机制的分析,我们可以更深入地理解ZooKeeper的工作原理及其应用场景。这不仅有助于开发者更好地利用ZooKeeper提供的功能,...
3. **Watch机制** Watch是ZooKeeper的一个重要特性,它允许客户端注册监听特定ZNode的变更。一旦ZNode发生变化,ZooKeeper会向注册了Watch的客户端发送事件通知,这种机制使得分布式应用可以实时响应数据变化。 4....
Zookeeper的关键特性之一是它使用watch机制,允许客户端在监控的znode发生变化时获得通知。 在Zookeeper集群中,有三种角色:Leader、Follower和Observer。集群中只有一个Leader,它负责处理客户端的写请求并同步...
记录一些简单示例和偶尔的思绪 ...思考 Zookeeper Watch 机制,对 cloud 服务进行优化? ps:听说最近 Spring Cloud Alibaba 对 openfeign 和 Dubbo 做了兼容,采用降级调用 openfeign 假装 FeignAutoConfiguration F
通过对Zookeeper架构、ZAB协议、选举机制、数据模型等核心概念的探究,开发者可以更好地运用Zookeeper解决实际问题,提升系统性能和稳定性。在实际项目中,结合Zookeeper提供的API,我们可以构建出更加健壮、高效的...
其次,Zookeeper支持Watch机制。Watch是一种一次性触发的事件监听器,当某个ZNode的数据或者状态发生变化时,所有设置了相应Watch的客户端都会收到通知。这种机制使得分布式系统中的节点能够实时感知到系统的变化,...
Zookeeper的核心概念包括数据模型、会话、监控(Watches)以及与时间相关的机制。 1、前言 Zookeeper作为一个高可用的服务,为分布式系统提供了统一的命名空间、配置管理、领导者选举等关键功能。它通过提供一种...
Zookeeper的Watch机制能够使客户端在指定的节点发生变化时得到通知。ACL控制则提供了一种安全机制,用于控制对Zookeeper数据的访问权限。 Zookeeper客户端的启动流程涉及Zookeeper类,而Zookeeper服务器的启动流程...
Zookeeper的C库不仅提供基本的CRUD操作(创建、读取、更新、删除),还支持 watches(观察者)机制,这是Zookeeper的一个重要特性。通过设置watch,客户端可以实时监控Zookeeper中的数据变化,当数据发生变化时,...
在本篇文章中,我们将深入探讨ZooKeeper在分布式环境中的设计与应用,包括集群部署、与Dubbo的整合、分布式锁的实现、主节点选举、负载均衡以及Watch机制和权限管理。 首先,**集群部署**是ZooKeeper的基础,它采用...
Dubbo通过Zookeeper实现了服务的自动注册与发现,简化了服务调用的过程,同时利用Zookeeper的Watch机制和一致性服务,保证了服务的动态调整和高可用性。这种组合在分布式系统中广泛应用,为构建大规模、复杂的企业级...
此外,ZooKeeper支持Watch机制,允许客户端对特定的数据节点设置监听,一旦数据发生变化,ZooKeeper会立即通知客户端。这种机制对于实现分布式锁、选举算法和分布式队列等高级功能至关重要。 总之,Linux版的...