zookeeper watch机制的理解
发布时间 - 2026-01-11 03:21:58 点击率:次首先我们看看为什么添加Watch。

ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建更多复杂的分布式协调功能。
多个分布式进程通过ZooKeeper提供的 API 来操作共享的ZooKeeper内存数据对象ZNode来达成某种一致的行为或结果,这种模式本质上是基于状态共享的并发模型,与Java的多线程并发模型一致,他们的线程或进程都是“共享式内存通信”。Java没有直接提供某种响应式通知接口来监控某个对象状态的变化,只能要么浪费CPU时间毫无响应式的轮询重试,或基于Java提供的某种主动通知(Notif)机制(内置队列)来响应状态变化,但这种机制是需要循环阻塞调用。而ZooKeeper实现这些分布式进程的状态(ZNode的Data、Children)共享时,基于性能的考虑采用了类似的异步非阻塞的主动通知模式即Watch机制,使得分布式进程之间的“共享状态通信”更加实时高效,其实这也是ZooKeeper的主要任务决定的—协调。
所有的Zookeeper读操作,包括getData()、getChildren()和exists(),都有一个开关,可以在操作的同时再设置一个watch。在ZooKeeper中,Watch是一个一次性触发器,会在被设置watch的数据发生变化的时候,发送给设置watch的客户端。watch的定义中有三个关键点:
一次性触发器
一个watch事件将会在数据发生变更时发送给客户端。例如,如果客户端执行操作getData(“/znode1″, true),而后/znode1 发生变更或是删除了,客户端都会得到一个/znode1 的watch事件。如果/znode1 再次发生变更,则在客户端没有设置新的watch的情况下,是不会再给这个客户端发送watch事件的。
发送给客户端
这就是说,一个事件会发送给客户端,但可能在操作成功的返回值到达发起变动的客户端之前,这个事件还没有送达watch的客户端。Watch是异步发送的。但ZooKeeper保证了一个顺序:一个客户端在收到watch事件之前,一定不会看到它设置过watch的值的变动。网络时延和其他因素可能会导致不同的客户端看到watch和更新返回值的时间不同。但关键点是,每个客户端所看到的每件事都是有顺序的。
被设置了watch的数据
这是指节点发生变动的不同方式。你可以认为ZooKeeper维护了两个watch列表:data watch和child watch。getData()和exists()设置data watch,而getChildren()设置child watch。或者,可以认为watch是根据返回值设置的。getData()和exists()返回节点本身的信息,而getChildren()返回子节点的列表。因此,setData()会触发znode上设置的data watch(如果set成功的话)。一个成功的?create() 操作会触发被创建的znode上的数据watch,以及其父节点上的child watch。而一个成功的?delete()操作将会同时触发一个znode的data watch和child watch(因为这样就没有子节点了),同时也会触发其父节点的child watch。
Watch由client连接上的ZooKeeper服务器在本地维护。这样可以减小设置、维护和分发watch的开销。当一个客户端连接到一个新的服务器上时,watch将会被以任意会话事件触发。当与一个服务器失去连接的时候,是无法接收到watch的。而当client重新连接时,如果需要的话,所有先前注册过的watch,都会被重新注册。通常这是完全透明的。只有在一个特殊情况下,watch可能会丢失:对于一个未创建的znode的exist watch,如果在客户端断开连接期间被创建了,并且随后在客户端连接上之前又删除了,这种情况下,这个watch事件可能会被丢失。?
ZooKeeper对Watch提供了什么保障
对于watch,ZooKeeper提供了这些保障:
Watch与其他事件、其他watch以及异步回复都是有序的。ZooKeeper客户端库保证所有事件都会按顺序分发;客户端会保障它在看到相应的znode的新数据之前接收到watch事件;从ZooKeeper接收到的watch事件顺序一定和ZooKeeper服务所看到的事件顺序是一致的。
关于Watch的一些值得注意的事情
Watch是一次性触发器,如果你得到了一个watch事件,而你希望在以后发生变更时继续得到通知,你应该再设置一个watch。
因为watch是一次性触发器,而获得事件再发送一个新的设置watch的请求这一过程会有延时,所以你无法确保你看到了所有发生在ZooKeeper上的一个节点上的事件。所以请处理好在这个时间窗口中可能会发生多次znode变更的这种情况。(你可以不处理,但至少请认识到这一点)。
一个watch对象或一个函数/上下文对,为一个事件只会被通知一次。比如,如果同一个watch对象在同一个文件上分别通过exists和getData注册了两次,而这个文件之后被删除了,这时这个watch对象将只会收到一次该文件的deletion通知。
当你从一个服务器上断开时(比如服务器出故障了),在再次连接上之前,你将无法获得任何watch。请使用这些会话事件来进入安全模式:在disconnected状态下你将不会收到事件,所以你的程序在此期间应该谨慎行事。
总结
以上就是本文关于zookeeper watch机制的全部介绍,有兴趣的朋友可以参阅:为zookeeper配置相应的acl权限、apache zookeeper使用方法实例详解等,希望对大家有所帮助。
# zookeeper
# watch机制
# 实现watch
# java使用zookeeper实现的分布式锁示例
# 基于Zookeeper的使用详解
# 使用curator实现zookeeper锁服务的示例分享
# Shell脚本实现自动安装zookeeper
# 理解zookeeper选举机制
# 为zookeeper配置相应的acl权限
# java 中 zookeeper简单使用
# apache zookeeper使用方法实例详解
# 如何操作Redis和zookeeper实现分布式锁
# 深入浅析ZooKeeper的工作原理
# 客户端
# 都是
# 这是
# 发送给
# 你可以
# 将会
# 在此
# 返回值
# 会在
# 只会
# 情况下
# 你将
# 其父
# 是一个
# 他们的
# 这一
# 如果你
# 都有
# 还没有
# 会有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
三星网站视频制作教程下载,三星w23网页如何全屏?
Android实现代码画虚线边框背景效果
创业网站制作流程,创业网站可靠吗?
详解CentOS6.5 安装 MySQL5.1.71的方法
如何在阿里云虚拟主机上快速搭建个人网站?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
昵图网官方站入口 昵图网素材图库官网入口
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
原生JS实现图片轮播切换效果
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
JS经典正则表达式笔试题汇总
如何在万网ECS上快速搭建专属网站?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
HTML 中如何正确使用模板变量为元素的 name 属性赋值
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何确保西部建站助手FTP传输的安全性?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
简单实现Android验证码
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
iOS发送验证码倒计时应用
如何快速搭建个人网站并优化SEO?
Python数据仓库与ETL构建实战_Airflow调度流程详解
jQuery validate插件功能与用法详解
如何在IIS管理器中快速创建并配置网站?
如何在IIS中新建站点并配置端口与IP地址?
iOS中将个别页面强制横屏其他页面竖屏
js实现获取鼠标当前的位置
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
敲碗10年!Mac系列传将迎来「触控与联网」双革新
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
香港服务器建站指南:免备案优势与SEO优化技巧全解析
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
音响网站制作视频教程,隆霸音响官方网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
制作旅游网站html,怎样注册旅游网站?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何在云主机上快速搭建网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
中国移动官方网站首页入口 中国移动官网网页登录
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】

