前言
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
正文
Watch 机制的简介
ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。
在 ZooKeeper 中,引入了 Watch 机制来实现这种分布式的通知功能。
ZooKeeper 允许客户端向服务端注册一个 Watch 监听,当服务端的一些事件触发了这个 Watch ,那么就会向指定客户端发送一个事件通知,来实现分布式的通知功能。
关于发布订阅模式的更多内容可以参考我的这篇博客——你怎么看待发布订阅模式的?
Watch 机制的特点
一次性触发
当 Watch 的对象发生改变时,将会触发此对象上 Watch 所对应的事件,这种监听是次性的,后续再次发生同样的事件,也不会再次触发。
事件封装
ZooKeeper 使用 WatchedEvent 对象来封装服务端事件并传递。
该对象包含了每个事件的 3 个基本属性,即通知状态( keeperState )、事件类型( EventType )和节点路径( path )。
异步发送
Watch 的通知事件是从服务端异步发送到客户端的
先注册再触发
ZooKeeper 中的 Watch 机制,必须由客户端先去服务端注册监听,这样才会触发事件的监听,并通知给客户端。
Watch 机制的通知状态和事件类型
同一个事件类型在不同的连接状态中代表的含义有所不同,下表列举了常见的连接状态和事件类型。
连接状态 | 状态含义 | 事件类型 | 事件含义 |
---|---|---|---|
Disconnected | 连接失败 | NodeCreated | 节点被创建 |
SyncConnected | 连接成功 | NodeDataChanged | 节点数据变更 |
AuthFailed | 认证失败 | NodeChildrenChanged | 子节点数据变更 |
Expired | 会话过期 | NodeDeleted | 节点被删除 |
从表可知, ZooKeeper 常见的连接状态和事件类型分别有 4 种,具体含义如下。
状态
- 当客户端断开连接,这时客户端和服务器的连接就是 Disconnected 状态,说明连接失败;
- 当客户端和服务器的某一个节点建立连接,并完成一次 version 、 zxid 的同步,这时客户端和服务器的连接状态就是 SyncConnected ,说明连接成功;
- 当 ZooKeeper 客户端连接认证失败,这时客户端和服务器的连接状态就是 AuthFailed ,说明认证失败;
- 当客户端发送 Request 请求,通知服务器其上一个发送心跳的时间,服务器收到这个请求后,通知客户端下ー个发送心跳的时间是哪个时间点。
当客户端时间戳达到最后一个发送心跳的时间,而没有收到服务器发来的新发送心跳的时间,即认为自己下线,这时客户端和服务器的连接状态就是 Expired 状态,说明会话过期。
事件
- 当节点被创建时,NodeCreated 事件被触发;
- 当节点的数据发生变更时,NodeDataChanged 事件被触发;
- 当节点的直接子节点被创建、被删除、子节点数据发生变更时,NodeChildrenChanged 事件被触发;
- 当节点被删除时,NodeDeleted 事件被触发。