11.0 Zookeeper watcher 事件机制原理剖析

zookeeper 的 watcher 机制,可以分为四个过程:

  • 客户端注册 watcher。
  • 服务端处理 watcher。
  • 服务端触发 watcher 事件。
  • 客户端回调 watcher。

其中客户端注册 watcher 有三种方式,调用客户端 API 可以分别通过 getData、exists、getChildren 实现,利用前面章节创建的 maven 工程,新建 WatcherDemo 类,以 exists 方法举例说明其原理。

// 导入 ZooKeeper 相关的类
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.data.Stat;

// 定义 WatcherDemo 类,实现 Watcher 接口
public class WatcherDemo implements Watcher {

  // 静态 ZooKeeper 客户端
  static ZooKeeper zooKeeper;

  // 静态代码块,初始化 ZooKeeper 客户端
  static {
    try {
      // 创建 ZooKeeper 客户端实例,连接到 ZooKeeper 服务器
      zooKeeper = new ZooKeeper("192.168.3.39:2181", 4000, new WatcherDemo());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  // 重写 Watcher 接口的 process 方法,处理 ZooKeeper 事件
  @Override
  public void process(WatchedEvent event) {
    // 打印事件类型
    System.out.println("eventType:" + event.getType());

    // 判断事件类型
    if (event.getType() == Event.EventType.NodeDataChanged) {
      // 节点数据改变事件
      try {
        // 重新注册对节点的监视
        zooKeeper.exists(event.getPath(), true);
      } catch (KeeperException e) {
        e.printStackTrace();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  // main 方法,程序入口
  public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    // 定义节点路径
    String path = "/watcher";

    // 判断节点是否存在
    if (zooKeeper.exists(path, false) == null) {
      // 创建节点,并设置初始数据
      zooKeeper.create(path, "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    // 睡眠 1 秒
    Thread.sleep(1000);

    // 打印分割线
    System.out.println("-----------");

    // 重新注册对节点的监视,并设置 Watcher
    Stat stat = zooKeeper.exists(path, true);

    // 等待用户输入
    System.in.read();
  }
}

运行完程序,控制台显示:

此时启动 zookeeper 命令行终端,查看并且删除 watcher 节点:

IDE 控制台输出,触发了节点删除事件:

客户端发送请求给服务端是通过 TCP 长连接建立网络通道,底层默认是通过 java 的 NIO 方式,也可以配置 netty 实现方式。

注册 watcher 监听事件流程图:

1、客户端发送事件通知请求

在 Zookeeper 类调用 exists 方法时候,把创建事件监听封装到 request 对象中,watch 属性设置为 true,待服务端返回 response 后把监听事件封装到客户端的 ZKWatchManager 类中。

2、服务端处理 watcher 事件的请求

服务端 NIOServerCnxn 类用来处理客户端发送过来的请求,最终调用到 FinalRequestProcessor,其中有一段源码添加客户端发送过来的 watcher 事件:

然后进入 statNode 方法,在 DataTree 类方法中添加 watcher 事件,并保存至 WatchManager 的 watchTable 与 watchTable 中。

3、服务端触发 watcher 事件流程:

若服务端某个被监听的节点发生事务请求,服务端处理请求过程中调用 FinalRequestProcessor 类 processRequest 方法中的代码如下所示:

删除调用链最终到 DataTree 类中删除节点分支的触发代码段:

进入 WatchManager 类的 triggerWatch 方法:

继续跟踪进入 NIOServerCnxn,构建了一个 xid 为 -1,zxid 为 -1 的 ReplyHeader 对象,然后再调用 sendResonpe 方法。

4、客户端回调 watcher 事件

客户端 SendThread 类 readResponse 方法接收服务端触发的事件通知,进入 xid 为 -1 流程,处理 Event 事件。

希望你也学会了,更多编程源码模板请来二当家的素材网:https://www.erdangjiade.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/375348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulnhub中Beelzebub靶机

渗透思路 一.信息收集1.网段探测2.端口探测3.常见漏洞扫描4.目录扫描5.web页面分析 二.渗透继续目录扫描ssh连接提权提权,flag 一.信息收集 1.网段探测 ┌──(root㉿kali)-[~] └─# nmap -Pn 192.168.0.0/24 --min-rate 10000 Starting …

计算机科学导论(4)DMA传输原理

文章目录 DMA的工作原理DMA的优势DMA的类型DMA的应用 DMA(Direct Memory Access)直接内存访问是一种允许某些硬件子系统在不通过中央处理单元(CPU)的情况下,直接从内存读取或向内存写入数据的技术。这种方式可以显著提…

【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5 (上篇)

在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5 (上篇) 项目介绍 YOLOv5 是革命性的 "单阶段"对象检测模型的第五次迭代,旨在实时提供高速、高精度的结果,是世界上最受欢迎的视觉人工智能模型,代表了Ult…

电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM) 所谓预测,就是指通过对事物进行分析及研究,并运用合理的方法探索事物的发展变化规律,对其未来发展做出预先估计和判断。…

二叉树的锯齿形遍历,力扣

目录 题目: 我们直接看题解吧: 快速理解解题思路小建议: 解题方法: 相似题目对比分析: 解题分析: 解题思路: 补充说明: 思路优化: 代码实现(层序遍历倒序): 题…

osg模型的平移、缩放、旋转

加载2个模型,其中一个向上移动28个单位; 加载2个模型,其中一个缩放0.5倍,向下移动22个单位; 加载2个模型,其中一个缩放0.5倍、旋转45度、向右向下移动几个单位; 都是用矩阵实现的; …

基于CEVA DSP BX2的架构分析(六)-加载和存储单元(二)

6.4 指针修改机制 LS0和LS1都包含指针修改机制。当使用间接或索引寻址模式时,指针的修改可以与地址生成并行执行。在间接寻址模式中,指针包含地址,而在变址寻址模式下,指针包含偏移量(有关这些寻址模式的更多详细信息&…

axios get 请求 url 转码 空格转成+,导致请求失败(前端解决)

问题 GET 请求参数: URL-encoded 后: 浏览器将空格转成了,导致服务报错,返回 400。 解决 在请求拦截器中,对 params 进行处理。 axios.interceptors.request.use((config) > {let url config.url;if (config…

收藏:相当大赞的来自 Agilean产品团队的2篇关于重塑敏捷组织的绩效管理的文章

Agilean产品团队,是吴穹博士领导下最近在国内敏捷界很厉害的产品,今天看到两篇相当不错的说敏捷组织的上下篇文章,分享下,地址是:6个原则15项举措,重塑敏捷组织的绩效管理(上) 6个原…

Unity接入GVoice腾讯实时语音

Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型:独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…

C#委托的前世今生

起因 很多C#初学者,都遇到过这样的问题——线程间操作无效,从不是创建控件的线程访问它。 今天就这个问题,展开分析。 溯源 先说下这个问题产生的根源。 大家都知道,程序运行起来之后,首先会有一个主线程&#xff…

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示: 可以看到题目提示为: 密钥什么的,就不要放在前端了 然后我们打开题目链接: 然后我们查看网页源代码: 可以发现有用的内容全在网页源代码里。 前端验证…

将markdown格式内容在界面中展示出来(搭配上一篇使用)

1.定义一个div content 是你向展示的 markdown 格式数据 <div id"previewMarkdown"><textarea>{{ content }}</textarea> </div>2.导入js 这个都是 lib 目录下的 js 文件&#xff0c;因为 markdown 组件依赖这些 js 文件 <script src…

红外避障模块

目录 一、模块原理 二、模块使用说明 三、材料准备 四、代码 五、实验效果 实验效果 自动灯效果&#xff1a; 避障模块-CSDN直播 一、模块原理 红外避障模块利用光反射原理&#xff0c;模块前端拥有一个红外发射管和一个红外接收管。模块通电后红外发射管向前方不断发射…

vue前端RSA使用公钥进行加密,公钥进行解密

记录下RSA使用公钥进行加密&#xff0c;公钥进行解密&#xff1a; 背景&#xff1a;由于项目要求前后端进行数据加密传输&#xff0c;具体数据使用aes进行加密&#xff0c;aes密钥使用rsa进行加密&#xff0c;加密后的aes密钥放在请求头和响应头进行传输。这里实现的是前端vue…

springboot159基于springboot框架开发的景区民宿预约系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

net start mysql服务名无效|发生系统错误 解决办法

未输入正确的mysql服务名 解决办法&#xff1a; 使用net start命令查看可用的服务名&#xff0c;找到mysql的服务名 未使用管理员身份运行命令提示符 解决方法&#xff1a; 使用管理员身份运行命令提示符

十分钟GIS——geoserver+postgis+udig从零开始发布地图服务

1数据库部署 1.1PostgreSql安装 下载到安装文件后&#xff08;postgresql-9.2.19-1-windows-x64.exe&#xff09;&#xff0c;双击安装。 指定安装目录&#xff0c;如下图所示 指定数据库文件存放目录位置&#xff0c;如下图所示 指定数据库访问管理员密码&#xff0c;如下图所…

opensuse安装百度Linux输入法

前言 Linux下有输入法&#xff0c;拼音&#xff0c;百度的都有&#xff0c;但是用起来总感觉不如在windows下与安卓中顺手。 目前搜狗与百度都出了Linux的输入法&#xff0c;但是没有针对OpenSUSE的&#xff0c;只有ubuntu/deepin/UOS的安装包。 本文主要讲的如何把百度Linux输…