zookeeper的watch机制原理解析

目录
  • 一、Watch机制介绍
  • 二、zkCli客户端使⽤watch
    • 2.1、get -w命令详解
    • 2.2、ls -w命令详解
    • 2.3、ls -R -w命令详解
  • 三、curator客户端使⽤watch

一、Watch机制介绍

我们可以把 Watch 理解成是注册在特定 Znode 上的触发器。当这个 Znode 发⽣改变,也就是调⽤了 create , delete , setData ⽅法的时候,将会触发 Znode 上注册的对应事件,请求 Watch 的客户端会接收到异步通知。

具体交互过程如下:

  • 客户端调⽤ getData ⽅法的时候, watch 参数设置为 true 。服务端接到请求,返回节点数据,并 且在对应的哈希表⾥插⼊被 Watch的 Znode 路径。
  • 当被 Watch 的 Znode 已删除,服务端会查找哈希表,找到该 Znode 对应的所有

Watcher,异步通知客户端,并且删除哈希表中对应的 Key-Value。

这里的服务端指的是zk的服务端。

客户端使⽤了NIO通信模式监听服务端的调⽤。

二、zkCli客户端使⽤watch

zkCli客户端常用命令详解:

https://www.jb51.net/article/252869.htm

  • create /test:创建test节点
  • set /test aaa:给test节点赋值aaa数据
  • get -w /test:⼀次性监听节点,注意这里是监听的数据变化,假如test子节点的数据发生变化也是收不到监听消息的(假如在监听节点下创建和删除子节点这些都是监听不到的,但是删除监听的节点是可以监听到的)
  • ls -w /test :监听⽬录,创建和删除⼦节点会收到通知。⼦节点中新增节点不会收到通知
  • ls -R -w /test :对于⼦节点中⼦节点的变化,但内容的变化不会收到通知

2.1、get -w命令详解

创建一个节点后,然后通过 get -w /test监听节点,然后使用另外一个客户端对该节点进行了赋值,这时候可以看到收到的监听消息。

监听到后并不是监听到修改后新的值,而是类似于一个消息,意思是告诉他节点发生变化了。这时候可以通过get /test命令来获取节点被修改后的值。

再次使用另一个客户端set了一下值,并没有监听到消息,因为 get -w /test是⼀次性监听节点。

假如想一直监听的话,可以在收到监听消息后,立马再执行 get -w /test命令。

删除节点是可以监听到的,监听到的消息事件类型和数据修改是不一样的。

2.2、ls -w命令详解

ls -w监听当前节点的创建和删除

又使用命令开启了监听,然后在刚刚创建的sub1节点下又创建了一个子节点,这时候收不到监听的。

2.3、ls -R -w命令详解

三、curator客户端使⽤watch

springboot整合curator客户端:https://www.jb51.net/article/252816.htm

我直接是基于上一篇文章当中的项目进行watch练习!

@Test
/**
  * 监听test节点
  *
  * @throws Exception
  */
 @Test
 public void addNodeListener() throws Exception {

     NodeCache nodeCache = new NodeCache(curatorFramework, "/test");
     nodeCache.getListenable().addListener(new NodeCacheListener() {
         @Override
         public void nodeChanged() throws Exception {
             log.info("{} path nodeChanged: ", "/test");
             printNodeData();
         }
     });
     nodeCache.start();
     // 阻塞线程
     System.in.read();
 }

 /**
  * 获取test节点数据并打印
  *
  * @throws Exception
  */
 public void printNodeData() throws Exception {
     byte[] bytes = curatorFramework.getData().forPath("/test");
     log.info("data: {}", new String(bytes));
 }

到此这篇关于zookeeper的watch机制原理解析的文章就介绍到这了,更多相关zookeeper watch机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中的zookeeper常用命令详解

    目录 1.zkCli.sh客户端 2.多节点类型创建 3.查询节点 4.set数据 5.删除节点 6.权限设置 7.其他命令 注意我这里用的是官方最稳定的版本3.7.1,版本之间有个别命令是有差距的! 1.zkCli.sh客户端 zkCli.sh可以理解成客户端,也可以理解成命令行工具,把命令交给他,让他和zk的服务端打交道.类似于mysql,我们安装完mysql想要执行命令,那么就必须要通过mysql -u账号 -p密码进入命令行工具里面,才能执行sql. 在zookeeper/bin 目录下

  • zookeeper集群搭建超详细过程

    目录 一.准备三台虚拟机,并列出对应的IP地址和主机名,如下图所示 二.环境准备(下面的步骤每一台虚拟机都需要做!!) 1.关闭防火墙 2. 配置操作系统 3. 设置本机IP地址与MAC地址 三.安装与配置zookeeper 四.zookeeper集群测试 一.准备三台虚拟机,并列出对应的IP地址和主机名,如下图所示 IP Hostname 192.168.154.133 zookeeper1 192.168.154.134 zookeeper2 192.168.154.135 zookeepe

  • zookeeper watch机制的理解

    首先我们看看为什么添加Watch. ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建更多复杂的分布式协调功能. 多个分布式进程通过ZooKeeper提供的 API来操作共享的ZooKeeper内存数据对象ZNode来达成某种一致的行为或结果,这种模式本质上是基于状态共享的并发模型,与Java的多线程并发模型一致,他们的线程或进程都是"共享式内存通信".Java没有直接提供某种响应式通知接口来监控某个对象状态的变化,只能要么浪费C

  • Java ZooKeeper分布式锁实现图解

    什么是分布式锁 1.在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题. 2.但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境(多台机器),跨JVM之间已经无法通过多线程的锁解决同步问题.那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题--这就是分布式锁.(多节点从分布式组件中获取锁) 例如以下实例: 各种抢票软件客户端通过zoo

  • zookeeper的watch机制原理解析

    目录 一.Watch机制介绍 二.zkCli客户端使⽤watch 2.1.get -w命令详解 2.2.ls -w命令详解 2.3.ls -R -w命令详解 三.curator客户端使⽤watch 一.Watch机制介绍 我们可以把 Watch 理解成是注册在特定 Znode 上的触发器.当这个 Znode 发⽣改变,也就是调⽤了 create , delete , setData ⽅法的时候,将会触发 Znode 上注册的对应事件,请求 Watch 的客户端会接收到异步通知. 具体交互过程如下

  • Java方法参数传递机制原理解析

    这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参. 这就涉及到Java中的参数传递机制,值传递. 基本数据类型 基本数据类型,值传递的体现是数值的传递. public class TransferTempTest { public static void main(String[] args) {

  • java的package和import机制原理解析

    这篇文章主要介绍了java的package和import机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在说package.import机制前我们先来了解下java的CLASSPATH. CLASSPATH顾名思义就是class的路径,当我们在系统中运行某个java程序时,它就会告诉系统在这些地方寻找这个class文件 CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; 这是

  • SpringCloud Eureka自我保护机制原理解析

    这篇文章主要介绍了SpringCloud Eureka自我保护机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 自我保护机制演示 eureka在频繁修改微服务名称的时候,可以会出现如下现象: 2. 什么是自我保护模式? 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒).但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信

  • SpringBoot服务监控机制原理解析(面试官常问)

    前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的. 就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 SpringBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用. 本文基于 SpringBoot 2.3.1.RELEASE 版本演示. SpringBoot 监控 SpringBoot 中的监控可以分为 H

  • C++实现简单插件机制原理解析

    在我做的第一个页游项目中,服务器使用了插件的机制,但是当时的插件都是用C#写,而且如何实现的也不是很清楚.之后的几个页游项目都是自己一个人包揽服务器部分,所以一直没有写插件的需求.下一个页游项目服务器这边需要多人合作,因此我想把其他模块都独立的做成插件的模式,目前也是在探索阶段.通过网上资料查找以及自己的整理,实现了一个简单版本的插件机制.实现代码如下: 文件Object.hpp中实现了所有插件类的基类,所有插件都要继承该类. #ifndef __OBJECT_HPP__ #define __O

  • Java和Dubbo的SPI机制原理解析

    SPI: 简单理解就是,你一个接口有多种实现,然后在代码运行时候,具体选用那个实现,这时候我们就可以通过一些特定的方式来告诉程序寻用那个实现类,这就是SPI. JAVA的SPI 全称为 Service Provider Interface,是一种服务发现机制.它是约定在 Classpath 下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,然后文件里面记录的是此 jar 包提供的具体实现类的全限定名. 这样当我们引用了某个 jar 包的时候就可以去找这个 jar 包

  • Android6.0 消息机制原理解析

    消息都是存放在一个消息队列中去,而消息循环线程就是围绕这个消息队列进入一个无限循环的,直到线程退出.如果队列中有消息,消息循环线程就会把它取出来,并分发给相应的Handler进行处理:如果队列中没有消息,消息循环线程就会进入空闲等待状态,等待下一个消息的到来.在编写Android应用程序时,当程序执行的任务比较繁重时,为了不阻塞UI主线程而导致ANR的发生,我们通常的做法的创建一个子线程来完成特定的任务.在创建子线程时,有两种选择,一种通过创建Thread对象来创建一个无消息循环的子线程:还有一

  • Python语法垃圾回收机制原理解析

    一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那什么样的变量值是没有用的呢? 由于变量名是访问到变量值的唯一方式,所以当一个变量值不再关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是没有用的,就应该被当成一个垃圾回收. 毫无疑问,内存空间的申请与回收是非常耗费精力的事情,而且存在很大的危险性,稍有不慎就有可能引发内存溢出问题,好在Cp

  • SqlServer中tempdb的日志机制原理解析及示例分享

    测试用例 我们分别在用户数据库(testpage),tempdb中创建相似对象t1,#t1,并在tempdb中创建创建非临时表,然后执行相应的insert脚本(用以产生日志),并记录执行时间用以比较用以比较说明tempdb"快" Code 用户数据库testpage use testpage go create table t1 ( id int identity(1,1) not null, str1 char(8000) ) declare @t datetime2=sysutcd

随机推荐