1.摘要
- Watcher相关类简介,类图说明
- Watcher的意义,通知状态(keeperState)与事件类型(EventType)
- WatchedEvent 和 WatcherEvent 描述zk检测到变化的事件,以及对应用于网络传输的封装类
2.watcher相关类图
- Watcher,接口类型,其定义了process方法,另外定义内部类Event,再包含内部类KeeperState和EventType来描述Event发生时zk的状态以及对应event类型
- WatchedEvent,代表zk上一个Watcher能够回应的变化,包含了变化事件的类型,zk状态以及变化影响的znode的path
- WatcherEvent : 是WatchedEvent用于网络传输的封装类
- ClientWatchManager:接口,根据Event得到需要通知的watcher
- ZKWatchManager为ClientWatchManager的实现
3.Watcher
Watcher是什么
ZK中引入Watcher机制来实现分布式的通知功能
ZK允许客户端向服务端注册一个Watcher监听,当服务点的的指定事件触发监听时,那么服务端就会向客户端发送事件通知,以便客户端完成逻辑操作(即客户端向服务端注册监听,并将watcher对象存在客户端的Watchermanager中
服务端触发事件后,向客户端发送通知,客户端收到通知后从wacherManager中取出对象来执行回调逻辑)
特性
一次性:一旦一个watcher被触发,ZK都会将其从相应的的存储中移除,所以watcher是需要每注册一次,才可触发一次。
客户端串行执行:客户端watcher回调过程是一个串行同步的过程
轻量:watcher数据结构中只包含:通知状态、事件类型和节点路径
在ZooKeeper中,接口类Watcher定义了事件通知相关的逻辑,包含了KeeperState和EventType两个枚举类,分别代表通知状态和事件类型。
类图如下
简单介绍上面类图就是
Watcher接口拥有process函数,用于处理回调
内部类Event又包含内部类KeeperState以及EventType
KeeperState用于记录Event发生时的zk状态(通知状态)
EventType用于记录Event的类型
3.1方法process
//回调函数实现该函数,表示根据event执行的行为
abstract public void process(WatchedEvent event);
3.2内部类Event
包含KeeperState和EventType两个内部类,通过枚举类实现
方法很简单,就是int值与对应枚举类型的转换
两者的枚举类型以及两者之间的关系,触发条件可以参考《paxos到zk》中的图
KeeperState与EventType一览表
4.WatchedEvent 和 WatcherEvent
WatchedEvent :代表zk上一个Watcher能够回应的变化,包含了变化事件的类型,zk状态以及变化影响的znode的path
WatcherEvent : 是WatchedEvent用于网络传输的封装类
WatchedEvent 类图如下
WatchedEvent类图
三个成员变量很好的解释了WatchedEvent的意义,即事件的类型,zk状态以及变化影响的znode的path
方法基本都好理解,涉及WatcherEvent 有一个构造方法和一个getWrapper方法
这里稍微强调一下 getWrapper方法
/**
* Convert WatchedEvent to type that can be sent over network
*/
//转化成可供网络传输,序列化的WatcherEvent
public WatcherEvent getWrapper() {
return new WatcherEvent(eventType.getIntValue(),
keeperState.getIntValue(),
path);
}
}
WatcherEvent实现了Record接口,可以理解为WatchedEvent用于网络传输的封装类
感兴趣的可以扫描关注微信公众号,会分享一些技术总结以及大厂的面试经验。
公众号:说说互联网的那些事