请描述一下Zookeeper 的通知机制是什么?
1 个回答
能轻易失去的东西,我从未觉得重要。大黑牛Zookeeper 的通知机制允许客户端向服务端的某个 znode 注册一个 Watcher 监听,当服务端的一些指定事件触发这个 Watcher 时,服务端会向指定客户端发送一个事件通知,从而实现分布式的通知功能。客户端根据 Watcher 通知的状态和事件类型做出业务上的改变。 #### 通知机制的三个步骤 1. **客户端注册 Watcher** - **调用 API**:客户端调用三个 API(如 `exists`、`getData`、`getChildren`),传入 Watcher 对象。 - **标记请求**:客户端在请求中标记 Watcher,将其封装到 `WatchRegistration` 对象中。 - **封装 Packet**:客户端将请求封装成 Packet 对象,发送给服务端。 - **注册到 ZKWatcherManager**:收到服务端响应后,将 Watcher 注册到 `ZKWatcherManager` 中进行管理。 - **完成注册**:请求返回,完成 Watcher 的注册。 2. **服务端处理 Watcher** - **接收并存储 Watcher**:服务端接收 Watcher 并进行存储。 - **Watcher 触发**:当某个事件触发 Watcher 时,服务端会调用 `process` 方法来触发 Watcher。 3. **客户端回调 Watcher** - **接收事件通知**:客户端的 `SendThread` 线程接收服务端发送的事件通知。 - **回调 Watcher**:`SendThread` 线程将事件通知交给 `EventThread` 线程,由 `EventThread` 线程回调 Watcher。 - **一次性机制**:客户端的 Watcher 是一次性的,一旦被触发后,该 Watcher 就失效了。 ### 详细流程 1. **客户端注册 Watcher**: - 客户端通过调用 Zookeeper API(如 `exists`、`getData`、`getChildren`)来注册 Watcher。 - 客户端将 Watcher 对象封装到请求中,并发送给服务端。 - 服务端接收到请求后,将 Watcher 存储在相应的 znode 上。 - 服务端响应客户端,通知 Watcher 注册成功。 2. **服务端处理 Watcher**: - 当 znode 上发生变化(如节点数据变更、节点删除、子节点变更等)时,服务端触发相应的 Watcher。 - 服务端调用 `process` 方法,将事件通知发送给注册了 Watcher 的客户端。 3. **客户端回调 Watcher**: - 客户端的 `SendThread` 线程接收到事件通知,并将其交给 `EventThread` 线程处理。 - `EventThread` 线程回调客户端的 Watcher,对应的业务逻辑被触发。 - 由于 Watcher 是一次性的,触发后即失效。如果需要持续监听,客户端需要再次注册 Watcher。 ### 总结 Zookeeper 的通知机制通过 Watcher 实现,分为客户端注册、服务端处理和客户端回调三个步骤。客户端可以向服务端的 znode 注册 Watcher,当 znode 发生变化时,服务端会通知客户端。客户端根据接收到的通知,进行相应的业务处理。值得注意的是,Watcher 是一次性的,触发后需要重新注册。发布于 2024-08-03 19:56 •IP属地 海南举报评论收藏
公众号进入网站体验更佳

