Zookeeper 对节点的 watch 监听通知是永久的吗?
1 个回答
世间万物,唯有过往伤人最深。凯瑟琳Zookeeper 对节点的 Watch 监听通知 **不是永久的**,而是一次性的。无论是在服务端还是客户端,一旦一个 Watcher 被触发,都会将其从相应的存储中移除。 #### 一次性 Watcher 的设计理由 1. **减轻服务端压力**: - 如果 Watcher 是永久的,对于更新非常频繁的节点,服务端会不断向客户端发送事件通知。这会给网络和服务端带来巨大的压力。 - 一次性 Watcher 设计可以有效地减轻服务端的负担,避免因频繁的事件通知而导致性能下降。 2. **优化网络负载**: - 由于 Watcher 被触发后即失效,服务端只需在事件发生时通知客户端一次,避免了大量冗余的网络通信。 #### 触发机制 1. **服务端触发 Watcher**: - 当某个节点(znode)发生变化(如数据变更、节点删除、子节点变更等)时,服务端会触发注册在该节点上的 Watcher。 - 触发 Watcher 后,服务端会将该 Watcher 从存储中移除,不再对其进行管理。 2. **客户端接收通知**: - 客户端接收到事件通知后,会由相应的线程处理并回调 Watcher。 - 处理完通知后,客户端也会将该 Watcher 移除。 #### 再次注册 Watcher - 如果客户端需要持续监听某个节点的变化,需要在每次 Watcher 被触发后,手动重新注册 Watcher。 - 这可以通过再次调用相关的 Zookeeper API(如 `exists`、`getData`、`getChildren`)来实现。 ### 具体流程 1. **客户端注册 Watcher**: - 调用 Zookeeper API 注册 Watcher。 - 服务端将 Watcher 存储在相应的节点上。 2. **节点发生变化**: - 节点变化触发服务端的 Watcher。 - 服务端发送事件通知给客户端,并将 Watcher 从存储中移除。 3. **客户端处理通知**: - 客户端接收到通知后,回调 Watcher 进行相应的处理。 - 处理完成后,客户端将 Watcher 移除。 4. **需要持续监听时**: - 客户端需要手动再次调用相关 API,重新注册 Watcher。 ### 总结 Zookeeper 的 Watch 监听通知是一次性的设计,有效地减轻了服务端和网络的压力。在触发后,无论是服务端还是客户端,都会将 Watcher 移除。如果需要持续监听节点变化,客户端需要在每次 Watcher 触发后重新注册。发布于 2024-08-02 11:28 •IP属地 甘肃举报评论收藏
公众号进入网站体验更佳

