Watcher机制是zookeeper三大特性之一,很多ZK的应用场景都都可以看到它的影子,比如集群管理、配置维护、分布式锁等,在此做一个简单梳理
- watcher 工作原理
由图可看出watcher机制的绝大部分逻辑都由客户端独立存储,比如WatchManager,回调函数等
- watcher 特性
zk 的 watcher 机制具有非常重要的两个特性:
1. 一次性:一旦一个 watcher 被触发,zk 就会将其从客户端的 WatchManager 中删除,服务端中也会删除该 watcher。zk 的 watcher 机制不适合监听变化非常频繁的场景
2.轻量级:真正传递给 Server 的是一个简易版的 watcher,回调逻辑存放在客户端,没有在服务端
- watcher 事件
客户端所处状态 | 事件类型(常量值) | 触发条件 | 说明 |
SyncConnected | None(-1) | 客户端与服务器成 功建立会话 | 此时客户端与服务器处 于连接状态 |
NodeCreated(1) | Watcher 监听的对 应数据节点被创建 | ||
NodeDeleted(2) | Watcher 监听的对 应数据节点的数据 内容发生变化 | ||
NodeDataChanged(3) | Watcher 监听的节 点的子节点列表发 生变化 | ||
NodeChildrenChanged(4) | Watcher 监听的节 点的子节点列表发 生变化 | ||
Disconnected(0) | None(-1) | 客户端与 zk 断开连 接 | 此时客户端与服务器处 于连接断开状态 |
Expired(-112) | None(-1) | 会话失效 | 此时客户端会话失效, 通常会收到 SessionExpiredException 异常 |
AuthFailed | None(-1) | 使用错误的 scheme 进行权限检查 | 通常会收到 AuthFailedException |