首页 > 其他分享 >ZooKeeper——Watcher机制

ZooKeeper——Watcher机制

时间:2023-03-21 10:37:37浏览次数:36  
标签:状态 ZooKeeper Watch 接口 Watcher 机制 客户端 分布式


摘要

ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建更多复杂的分布式协调功能。

原理

多个分布式进程通过ZooKeeper提供的API来操作共享的ZooKeeper内存数据对象ZNode来达成某种一致的行为或结果,这种模式本质上是基于状态共享的并发模型,与Java的多线程并发模型一致,他们的线程或进程都是”共享式内存通信“。Java没有直接提供某种响应式通知接口来监控某个对象状态的变化,只能要么浪费CPU时间毫无响应式的轮询重试,或基于Java提供的某种主动通知(Notif)机制(内置队列)来响应状态变化,但这种机制是需要循环阻塞调用。而ZooKeeper实现这些分布式进程的状态(ZNode的Data、Children)共享时,基于性能的考虑采用了类似的异步非阻塞的主动通知模式即Watch机制,使得分布式进程之间的“共享状态通信”更加实时高效,其实这也是ZooKeeper的主要任务决定的—协调。Consul虽然也实现了Watch机制,但它是阻塞的长轮询

ZooKeeper——Watcher机制_数据

ZooKeeper VS JVM

ZooKeeper对等于JVM,ZooKeeper包含状态对象(ZNode)和分布式进程的底层执行引擎Zab,而JVM内部包含堆(多线程共享的大量对象存放区域)和多线程执行正确性约束规范JMM(Java内存模型),JMM确保了多线程的执行顺序是正确的。Zab协议使得ZooKeeper的内部修改状态操作直接是有序串行的,而JVM内部则是乱序并行的,需要添加额外的机制才能保证时序(内存屏障、处理器原子指令),而状态读取时,JVM和ZooKeeper都存在直接读取时读到旧数据,但ZooKeeper有Watch机制使得响应式读取更高效,而JVM只能使用底层的内存屏障刷新共享状态,以便其他线程再次读取时获得正确的新数据。

ZooKeeper提供的接口使得所有的分布式进程的执行都是异步非阻塞的(WaitFree算法)内部是基于Version的CAS操作,而JVM提供了阻塞的和非阻塞的多种接口,有Synchronized、Volatile、AtomicOperations。基于接口之上构建线程或分布式进程之间更复杂的同步或协调功能时,Java并发库直接提供了闭锁、循环栅栏、信号量等同步工具以及基础的抽象队列同步器,而ZooKeeper则需要用户基于接口自行构建各种分布式协调功能(分布式锁、分布式发布订阅、集群成员关系管理)。如下图:

ZooKeeper——Watcher机制_JVM_02

ZooKeeper的Watch架构

Watch的整体流程如下图所示,客户端先向ZooKeeper服务端成功注册想要监听的节点状态,同时客户端本地会存储该监听器相关的信息在WatchManager中,当ZooKeeper服务端监听的数据状态发生变化时,ZooKeeper就会主动通知发送相应事件信息给相关会话客户端,客户端就会在本地响应式的回调相关​​Watcher​​的Handler。

ZooKeeper——Watcher机制_Zookeeper_03

ZooKeeper的Watch特性

  • Watch是一次性的,每次都需要重新注册,并且客户端在会话异常结束时不会收到任何通知,而快速重连接时仍不影响接收通知。
  • Watch的回调执行都是顺序执行的,并且客户端在没有收到关注数据的变化事件通知之前是不会看到最新的数据,另外需要注意不要在Watch回调逻辑中阻塞整个客户端的Watch回调
  • Watch是轻量级的,WatchEvent是最小的通信单元,结构上只包含通知状态、事件类型和节点路径。ZooKeeper服务端只会通知客户端发生了什么,并不会告诉具体内容。

Watcher接口设计

ZooKeeper——Watcher机制_JVM_04

如上图所示,Watch被设计成一个接口,任何实现了Watcher接口的类就是一个新的Watcher,Watcher内部包含2个枚举类,一个KeeperState,表示当事件发生时ZooKeeper的状态,另一个是事件发生的类型,主要分为2类(一类是ZNode内容的变化,另一类是ZNode子节点的变化),具体的描述见下表。

ZooKeeper——Watcher机制_JVM_05

WatchEvent的设计

ZooKeeper——Watcher机制_Zookeeper_06

如上图所示,WatchEvent有2种表示模式,一种是逻辑表示即WatchedEvent,是直接封装了各种抽象的逻辑状态(KeeperState,EventType),适用于客户端和服务端各自内部处理,另一种是物理表示即封装的更多是底层基础的传输数据结构(int,String),并且实现了序列化接口,主要用来做底层的数据传输。

标签:状态,ZooKeeper,Watch,接口,Watcher,机制,客户端,分布式
From: https://blog.51cto.com/u_13643065/6139638

相关文章

  • OpenStack使用ISO镜像安装虚拟机制作镜像模板(本文底稿原创,由ChatGPT润色)
    在OpenStack云平台中,使用ISO镜像安装虚拟机是非常常见的一种方式。本文将介绍如何在OpenStack中使用ISO镜像创建一个虚拟机,并将其制作成模板。第一步,我们需要将ISO镜像上......
  • Zookeeper——知识脑图
    摘要本博文主要是介绍有关于学习Zookeeper的相关的脑图。帮助大家能够全局思维的学习和掌握的Zookeeper。并能够应用在自己的项目上,同时的也给面试的Zookeeper相关问题提供......
  • FastDDS-5.发现机制
    5、发现机制FastDDS作为一种数据分发服务(DDS)实现,提供了发现机制,允许在域参与者之间自动查找和匹配DataWriter和DataReader,以便他们可以开始共享数据。对于所有机制,此发......
  • IM系统中如何保证消息的可靠投递(即QoS机制)
    消息的可靠性,即消息的不丢失和不重复,是im系统中的一个难点。当初qq在技术上(当时叫oicq)因为以下两点原因才打败了icq:1)qq的消息投递可靠(消息不丢失,不重复)2)qq的垃圾消息少(它a......
  • 小白如何从头理解FDB的运行机制和原理(入门版)
    什么是keyvalue分布式存储   Key-value分布式存储是一种高性能、可伸缩性和容错性强的分布式存储系统,它将数据以键值对的形式存储在分布式系统中的......
  • MySQL锁机制
        上文总结了MySQL的隔离级别,而隔离级别是通过锁机制实现的,所以针对锁机制展开详细描述。    首先介绍MySQL的锁可以分为:享/读/共享锁SharedLocks:针......
  • java-基础线程机制
     前言,基础线程机制:Executor管理多个异步任务的执行、Daemon守护线程、sleep()、yield() 一、Executor:1.newCachedThreadPool(),一个任务创建一个线程ExecutorServic......
  • 大数据下的协调者Zookeeper详解
    Zookeeper框架为什么要学习Zookeeper框架1、Zookeeper是作为大数据生态圈框架中非常重要的一员2、Zookeeper单独使用没有意义,主要是用来管理其他框架,被称为动物管理员3、后......
  • 1.2 垃圾回收机制
    1.什么场景下该使用什么垃圾回收策略?(1).对内存要求苛刻的场景想办法提高对象的回收效率,尽可能的多回收一些对象,腾出更多内存(2).在CPU使用率较高的情况下降低高并发时垃......
  • Matter 协议中的桥接机制(转自乐鑫博客)
    目前,亚马逊、苹果、谷歌和三星等多家大型物联网生态系统供应商已宣布支持Matter。可以预见的是,在逐渐扩展的Matter生态下,未来还将有更多厂商推出越来越多Matter设备。......