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结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200710223431996.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNTEzMjg0,size_16,color_FFFFFF,t_70)
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() {
@Override
public 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);