文章目录
 - 1.watcher(监听器)
 - 1.1.watcher组成
 - 1.2.watcher特性
 - 1.3.watcher结构
 - 1.3.1.KeeperState(通知状态)
 - 1.3.2.EventType(事件类型)
 - 1.3.3.方法以及可被监控的时事件类型
 
 
 - 2.watcher注册
 - 1.1.创建连接注册
 - 1.2.判断节点是否存在
 - 1.3.获取节点数据
 - 1.4.获取子节点列表
 
 
 
 
 
  
 
1.watcher(监听器)
 
	Zookeeper提供了分布式数据的发布/订阅功能,可以让客户端订阅某个节点,当节点发生变化(比如创建、修改、删除、数据获取、子节点获取)时,可以通知所有的订阅者。另外还可以为客户端连接对象注册监听器,可以监听到连接时的状态。这个实现机制在Zookeeper里面就是Watcher机制。watcher实现机制类似观察者模式。
 
备注:watcher监听是一次性的,当watcher被触发之后,需要重新注册才能监听。
 
1.1.watcher组成
 
- 服务端
 - 客户端
 - 客户端的监听管理器(WatchManager)
 
 
 客户端注册watcher到服务器,同时将watch对象保存到WatchManager中。当服务器监听到znode数据变化时,通知客户端。同时客户端的WatchManager触发回调事件(process())处理相应的逻辑,完成一次完整的watcher流程。
 
1.2.watcher特性
 
| 序号 | 名称 | 说明 | 
|---|
| 1 | 一次性 | watcher监听是一次性的,当watcher被触发之后,需要重新注册才能再次监听。 | 
| 2 | 客户端顺序回调 | watcher回调是顺序执行。一个watcher如果有太多的回调逻辑,可能会造成监听丢失的情况。 | 
| 3 | 轻量级 | 服务端通知客户端的最小单位是WatchEvent,只包括通知状态、事件类型和节点路径,客户端向服务端注册也是尽量减小数据单元,这样设计的数据量和一次性的注册,使Zookeeper的内存和网络的开销都很小。 | 
| 4 | 时效性 | 当session失效后,watcher跟随失效。 | 
 
1.3.watcher结构
 

 
1.3.1.KeeperState(通知状态)
 
| 序号 | 名称 | 说明 | 
|---|
| 1 | Unknown(Deprecated) | 未知。 | 
| 2 | Disconnected | 连接失败。 | 
| 3 | NoSyncConnected(Deprecated) | 连接成功 | 
| 4 | SyncConnected | 连接成功 | 
| 5 | AuthFailed | 认证失败 | 
| 6 | ConnectedReadOnly | 只读模式的连接成功。 | 
| 7 | SaslAuthenticated | sasl认证失败。 | 
| 8 | Expired | session会话过期。 | 
 
1.3.2.EventType(事件类型)
 
| 序号 | 名称 | 说明 | 
|---|
| 1 | None | 当KeeperState发生变化时候。 | 
| 2 | NodeCreated | 节点被创建。 | 
| 3 | NodeDeleted | 节点被删除。 | 
| 4 | NodeDataChanged | 节点数据被修改。 | 
| 5 | NodeChildrenChanged |  | 
 
1.3.3.方法以及可被监控的时事件类型
 
| 序号 | 名称 | NodeCreated | NodeChildrenChanged | NodeDataChanged | NodeDeleted | 
|---|
| 1 | zooKeeper.exists("/test", Watcher); | √ |  | √ | √ | 
| 2 | zooKeeper.getData("/test", Watcher); |  |  | √ | √ | 
| 3 | zooKeeper.getChildren("/test", Watcher); |  | √ |  | √ | 
 
2.watcher注册
 
1.1.创建连接注册
 
public void createConn() throws IOException, InterruptedException {zooKeeper = new ZooKeeper("127.0.0.1:2181", 10000, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {if (watchedEvent.getState()==Event.KeeperState.SyncConnected){System.out.println("zookeeper连接创建成功!");}}});
}
 
1.2.判断节点是否存在
 
zooKeeper.exists(String path, boolean watch);
zooKeeper.exists(String path, Watcher watcher);
 
1.3.获取节点数据
 
zooKeeper.getData(String path, boolean watch, Stat stat);
zooKeeper.getData(String path, Watcher watcher, Stat stat);
 
1.4.获取子节点列表
 
zooKeeper.getChildren(String path, boolean watch);
zooKeeper.getChildren(String path, Watcher watcher);