zookeeper事件监听机制
- watcher机制:
zookeeper提供了数据的发布/订阅功能,多个订阅者可同时监听某一特定主题对象,当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变 等),会实时、主动通知所有订阅者
zookeeper采用了Watcher机制实现数据的发布/订阅功能。该机制在被订阅对象发生变化时会异步通知客户端,因此客户端不必在Watcher注册后轮询阻塞,从而减轻了客户端压力
-
watcher模型:
客户端首先将watcher注册到zk服务端,同时将watcher对象保存在客户端的watcher管理器中,zk的服务端监听到数据的变化后,通知客户端,客户端的watcher管理器触发相关的watcher来回调来处理逻辑,完成整体的发布/订阅流程
-
watcher特性
-
一次性
watcher是一次性的,一旦被触发就会移除,再次使用时需要重新注册
-
轻量级
WatchEvent是最小的通信单元,结构上只包含通知状态、事件类型和节点 路径,并不会告诉数据节点变化前后的具体内容;
-
客户端顺序回调
watcher回调是顺序串行化执行的,只有回调后客户端才能看到最新的数 据状态。一个watcher回调逻辑不应该太多,以免影响别的watcher执行
-
时效性
watcher只有在当前session彻底失效时才会无效,若在session有效期内快速重连成功,则watcher依然存在,仍可接收到通知
-
-
watcher接口
Watcher是一个接口,任何实现了Watcher接口的类就是一个新的Watcher。
Watcher内部包含了两个枚举类:KeeperState、EventType
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8yCiNSs-1585660091783)(E:/Typora/typora-user-images/18300896-0cf1d1fd914f0a1e.webp)]
- Watcher通知状态**(KeeperState)**
KeeperState是客户端与服务端连接状态发生变化时对应的通知类型
枚举属性 | 说明 |
---|---|
SyncConnected | 客户端与服务器正常连接时 |
Disconnected | 客户端与服务器断开连接时 |
Expired | 会话session失效时 |
AuthFailed | 身份认证失败时 |
- Watcher事件类型**(EventType)**
EventType是数据节点(znode)发生变化时对应的通知类型
EventType变化时,KeeperState永远处于SyncConnected通知状态下;当KeeperState发生变化时, EventType永远为None。
枚举属性 | 说明 |
---|---|
None | 无 |
NodeCreated | Watcher监听的数据节点被创建时 |
NodeDeleted | Watcher监听的数据节点被删除时 |
NodeDataChanged | Watcher监听的数据节点内容发生变更时(无论内容数据是否变化) |
NodeChildrenChanged | Watcher监听的数据节点的子节点列表发生变更时 |
客户端接收到的相关事件通知中只包含状态及类型等信息,不包括节点变化前后的具体内容,变化前的数据需业务自身存储,变化后的数据需调用get等方法重新获取
- 捕获相应的事件
在zookeeper中采用
zk.exists(path, watch),zk.getData(path, watcher, stat) ,zk.getChildren(path, watch)
这样的方式为某个znode注册监听
注册方式 | created | childrenchanged | changed | delete |
---|---|---|---|---|
zk.exists(path, watch) | 可监控 | 可监控 | 可监控 | |
zk.getData(path, watcher, stat) | 可监控 | 可监控 | ||
zk.getChildren(path, watch) | 可监控 | 可监控 |
- 客户端和服务