IT袋

当前位置:主页 > 经验教程 > 建站编程 >

ZK的watch机制实现原理

ZK的watch机制实现原理

时间:2023-11-02 19:59:23 来源:IT袋 作者:马勇
导读:ZK的watch机制实现原理,小编带来的是ZK的watch机制实现原理的相关话题,接下来IT袋网小编就来介绍。 newZooKeeper(StringconnectString,intsessionTimeout,Watcherwatcher)这个Watcher将作为整个ZooKeeper会话期间的上

ZK的watch机制实现原理

小编带来的是ZK的watch机制实现原理的相关话题,接下来IT袋网小编就来介绍。

newZooKeeper(StringconnectString,intsessionTimeout,Watcherwatcher)这个Watcher将作为整个ZooKeeper会话期间的上下文,一直被保存在客户端ZKWatchManager的defaultWatcher

也可以动态添加watcher:getData(),exists,getChildren。

分布式环境下的观察者模式:通过客服端和服务端分别创建有观察者的信息列表。

客户端调用相应接口时,首先将对应的Watch事件放到本地的ZKWatchManager中进行管理。

服务端在接收到客户端的请求后根据请求类型判断是否含有Watch事件,并将对应事件放到WatchManager中进行管理。

在事件触发的时候服务端通过节点的路径信息查询相应的Watch事件通知给客户端,客户端在接收到通知后,首先查询本地的ZKWatchManager获得对应的Watch信息处理回调操作。

这种设计不但实现了一个分布式环境下的观察者模式,而且通过将客户端和服务端各自处理Watch事件所需要的额外信息分别保存在两端,减少彼此通信的内容,大大提升了服务的处理性能

ZK的watch机制实现原理

客户端实现过程

  • 标记该会话是一个带有Watch事件的请求
  • 通过DataWatchRegistration类来保存watcher事件和节点的对应关系
  • 客户端向服务器发送请求,将请求封装成一个Packet对象,并添加到一个等待发送队列outgoingQueue中调用负责处理队列outgoingQueue的SendThread线程类中的readResponse方法接收服务端的回调,并在最后执行finishPacket()方法将Watch注册到ZKWatchManager,sendThread通过发送path路径和watcher为true,到server注册watch事件

ZKWatchManager保存了Map<String,Set> dataWatchers、Map<String,Set> existsWatchers、Map<String,Set> childrenWatchers三个集合,客户端会在dataWatchers中会添加一个key为path路径的本地事件

服务端实现过程

  • 解析收到的请求是否带有Watch注册事件,通过FinalRequestProcessor类中的processRequest函数实现的。当getDataRequest.getWatch()值为True时,表明该请求需要进行Watch监控注册。
  • 将对应的Watch事件存储到WatchManager,通过zks.getZKDatabase().getData函数实现, WatchManger该类中有HashMap<String,HashSet> watchTable,key为path,Watcher是一个客户端网络连接封装,当节点变化时会通知对应的连接(连接通过心跳保持)

服务端触发过程

  • 调用WatchManager中的方法触发数据变更事件
  • 封装了一个具有会话状态、事件类型、数据节点3种属性的WatchedEvent对象。之后查询该节点注册的Watch事件,如果为空说明该节点没有注册过Watch事件。如果存在Watch事件则添加到定义的Wathcers集合中,并在WatchManager管理中删除。最后,通过调用process方法向客户端发送通知

相关阅读

  • Ceph版本发行生命周期 Ceph版本的发行与生命周期

    Ceph版本发行生命周期 Ceph版本的发行与生命周期

    为关注IT袋网网的网友们详解Ceph版本发行生命周期的介绍,一起来了解了解吧。 Ceph从Nautilus版本(14.2.0)开始,每年都会有一个新的稳定版发行,预计是每年的3月份发布,每年的新版本都会起

  • oracle索引类型有哪些 oracle创建、删除索引语句

    oracle索引类型有哪些 oracle创建、删除索引语句

    IT电脑小知识篇,关于oracle索引类型有哪些的IT小经验,如有不对的地方欢迎指正! 在Oracle数据库中,索引是一种数据库对象,用于加快表中数据的检索速度。 索引可以提高查询性能,但同时

  • js分割算数数组 讲解javascript用分割符分割文本

    js分割算数数组 讲解javascript用分割符分割文本

    今天分享:js分割算数数组和讲解javascript用分割符分割文本的内容,具体介绍如下: 数组是JavaScript编程中最常用的结构之一,这也是为什么了解它的内置方法很重要。 在本文中,我们研究一

  • DR/BDR的作用 DR/BDR的职能

    DR/BDR的作用 DR/BDR的职能

    您可能不了解DR/BDR的作用的相关知识,下面小编为您详细解答 OSPF是一种链路状态路由协议,它通过广播链路状态更新来维护路由信息。 当一个OSPF区域内有多个路由器连接到同一个多播网络(