当前位置: 首页 > article >正文

Zookeeper的监听机制

Zookeeper的监听机制是其实现分布式协调服务的一个核心功能。

它允许客户端注册Watcher(观察者)来监听特定的Znode(节点)上的事件,当Znode的状态发生变化时,Zookeeper会向注册了Watcher的客户端发送通知。

这种机制使得应用程序能够实时地感知到集群中节点的变化,从而作出相应的反应。

ZooKeeper 监听机制就是基于 zookeeper 上创建的节点,可以对这些节点绑
定监听事件,比如可以监听节点数据变更、
节点删除、子节点状态变更等事件。


通过这个事件机制,可以基于 zookeeper实现分布式锁,发布订阅(多个订阅
者同时监听某一个主题对象,当这个主题对象自身状态发生变化时,会通知所有
订阅者)等功能。 

监听机制的工作流程

  1. 注册Watcher:客户端在创建会话时可以注册Watcher到指定的Znode上。一旦Znode的状态发生改变,Zookeeper就会向注册了Watcher的客户端发送一个通知。
  2. 触发条件:Watcher可以在多种情况下被触发,包括但不限于:
    • 当Znode被创建时。
    • 当Znode的数据被更新时。
    • 当Znode被删除时。
    • 当子节点列表发生变化时。
  3. 发送通知:一旦触发条件满足,Zookeeper服务器会向客户端发送一个异步的通知,告诉它所关注的Znode发生了变化。这个通知通常包含一个事件类型(如NodeCreated、NodeDeleted、NodeDataChanged等)。
  4. 单次使用:重要的一点是,Watcher是一次性的。也就是说,一旦Watcher被触发并发送了通知,这个Watcher就失效了,需要重新注册以继续监听变化。
  5. 重新注册:客户端收到通知后,通常会重新注册Watcher,以继续监听后续的变化。

监听机制的应用示例

假设一个客户端想要监控一个名为/service的Znode,并且对它的数据变化感兴趣。它可以这样做:

Stat stat = zookeeper.exists("/service", true); // 注册Watcher
if (stat == null) {
    System.out.println("Node /service does not exist.");
} else {
    System.out.println("Node /service exists.");
}

在这个例子中,true参数指定了是否注册Watcher。如果/service节点存在,并且随后它的数据发生了变化,那么Zookeeper就会发送一个通知给客户端。客户端接收到通知后,通常会再次注册Watcher来继续监听。

监听机制的注意事项

  • 性能考量:由于Watcher是一次性的,并且是异步的,因此客户端需要确保在接收到通知后能够正确地处理并重新注册Watcher。
  • 并发控制:在并发环境下,多个客户端可能会同时尝试注册同一个Watcher,因此需要小心处理并发问题,以免造成混乱。
  • 网络延迟:由于Watcher是异步通知的,网络延迟可能会导致通知到达的时间不确定,因此应用程序应该具备一定的容错能力。

 

一、事件类型

  1. NodeCreated(节点创建)
    • 当一个新的Znode(节点)在Zookeeper的命名空间中被创建时,会触发这个事件。这可能是由于客户端执行了创建节点的操作,例如在Java中使用create方法,或者在命令行中使用相应的创建节点命令(如果有)。
  2. NodeDataChanged(节点数据修改)
    • 一旦Znode中的数据被更新,就会触发这个事件。例如,如果通过set命令(在命令行或者通过编程API中的对应操作)修改了节点的数据内容,那么所有注册了对该节点数据变化监听的客户端都会收到这个NodeDataChanged事件通知。
  3. NodeDeleted(节点删除)
    • 当一个Znode被从Zookeeper的命名空间中移除时,就会触发NodeDeleted事件。这可以是因为执行了delete命令(命令行或编程接口中的删除操作)。

二、命令解释

  1. stat -w path
    • stat命令通常用于查看Znode的状态信息,如版本号、创建时间等。当添加-w参数时,这表示对指定path的节点注册一个Watcher来监听与该节点状态相关的事件。具体来说,可能会监听该节点的创建、数据修改或者删除等事件,因为这些事件都可能导致节点状态的改变。
  2. ls -w path
    • ls命令用于列出指定path节点下的子节点列表。当使用-w参数时,是在该节点上注册一个Watcher来监听子节点的变化情况。当有子节点被创建、删除或者子节点数据发生变化(可能导致子节点列表的逻辑变化)时,会触发NodeChildrenChanged事件,注册了-w的客户端就会收到通知。
  3. get -w /node
    • get命令用于获取指定/node节点的数据内容。添加-w参数后,是在这个节点上注册一个Watcher,用于监听该节点数据的变化情况。当节点的数据被修改或者节点被删除时(因为节点删除也可以看作是一种特殊的数据变化情况),会触发相应的事件(如NodeDataChanged或者NodeDeleted),客户端会收到通知。

 

通过使用Watcher机制,Zookeeper能够支持实时的数据变更通知,这对于构建高度动态的应用程序和服务发现等场景非常有用。 


http://www.kler.cn/a/448884.html

相关文章:

  • 高级的SQL查询技巧有哪些?
  • 【工作流】工作顺序
  • 【数据结构练习题】链表与LinkedList
  • druid与pgsql结合踩坑记
  • 算法设计期末复习
  • 关于使用拓扑排序算法实现解析勾稽关系优先级的研究和实现
  • 软件测试丨性能测试工具-JMeter
  • 云手机方案全解析
  • C# 中串口读取问题及解决方案
  • Qt 给App创建自定义帮助文档
  • 【落羽的落羽 C语言篇】自定义类型——结构体
  • 【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)
  • 【java基础系列】实现数字的首位交换算法
  • 【C++】14___String容器
  • 访问器属性getter和setter
  • BERT的改进:ModernBERT
  • 模型 课题分离
  • ROS1安装教程
  • 5G -- 5G网络架构
  • # 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
  • BigBlueButton视频会议 vs 华为视频会议系统的详细对比
  • vue3实现打印table订单表格
  • 14爬虫:scrapy实现翻页爬取
  • <代码随想录> 算法训练营-2024.12.20
  • RAG基础知识及综述学习
  • 22 go语言(golang) - gin框架安装及使用(三)