zookeeper系列之异步通知模式-Watcher

1. Klipper从安装到运行 本文记录Klipper固件从安装,配置到运行的详细过程 阅读详情

1 watcher种类和事件种类

Watcher种类
1. zookeeper实例化时注入的默认Watcher
2. dataWatchers 一个Map<string Set<Watcher>>数据结构,保存调用getData时 注入的Watcher或者调用exist时path指定的节点存在
3. existWatchers 一个Map<string Set<Watcher>>数据结构,保存调用exits时对应的path节点不存在条件下注入的Watcher
4. childWatchers一个Map<string Set<Watcher>>数据结构,保存调用getChildren 时注入的Watcher
默认Watcher主要是处理连接建立成功,连接断了-会重连,SESSION失效-这个需要重新实例zookeeper对象这些事件
其他的三个Watcher都是MAP<String, SET<Watcher>>结构的,MAP中的KEY是zookeeper数据路径,当调用
exists,getData,getChildren函数时会需要传入一个Watcher,对应的path上的数据发生改变时,zookeeper服务器
会发送NOTIFY包给客户端,客户端在收到NOTIFY包后根据包指明的path和事件类别回调有关Watcher的process函数。
所有需要系统的管理这些Watcher,故分成三个MAP来管理这些Watcher。
当调用getData时将注入的Watcher加入到dataWatchers.get(path)的SET里面,调用childWatchers时一样。需要
重点注意的是当调用exists时,如果path不存在则加入到existWatchers.get(path)的SET里面,否则加入到
dataWatchers.get(path)的SET里面,这样做的原因是为了保持和客户端接收到NOTIFY包时处理一致。



Watch事件类型:

ZOO_CREATED_EVENT:节点创建事件,需要watch一个不存在的节点,当节点被创建时触发,此watch通过zoo_exists()设置
ZOO_DELETED_EVENT:节点删除事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHANGED_EVENT:节点数据改变事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHILD_EVENT:子节点列表改变事件,此watch通过zoo_get_children()或zoo_get_children2()设置
ZOO_SESSION_EVENT:会话失效事件,客户端与服务端断开或重连时触发
ZOO_NOTWATCHING_EVENT:watch移除事件,服务端出于某些原因不再为客户端watch节点时触发

watch事件与zookeeper读操作的对应关系图:


2 watcher api

Watcher是Zookeeper用来实现distribute lock, distribute configure, distribute queue等应用的主要手段。要监控data_tree上的任何节点的变化(节点本身的增加,删除,数据修改,以及孩子的变化)都可以在获取该数据时注册一个Watcher,这有很像Listener模式。一旦该节点数据变化,Follower会发送一个notification response,client收到notification响应,则会查找对应的Watcher并回调他们。 有以下接口可以注册Watcher:

1. Stat exists(final String path, Watcher watcher)

2. Stat exists(String path, boolean watch)

3. void exists(String path, boolean watch, StatCallback cb, Object ctx)

4. void exists(final String path, Watcher watcher, StatCallback cb, Object ctx)

5. byte[] getData(final String path, Watcher watcher, Stat stat)

6. byte[] getData(String path, boolean watch, Stat stat)

7. void getData(final String path, Watcher watcher, DataCallback cb, Object ctx)

8. void getData(String path, boolean watch, DataCallback cb, Object ctx)

9. List<string> getChildren(final String path, Watcher watcher)

10. List<string> getChildren(String path, boolean watch)

11. void getChildren(final String path, Watcher watcher,ChildrenCallback cb, Object ctx)

 

如果参数需要传递watcher,则可以自己定义Watcher进行回调处理。如果是Boolean型变量,当为true时,则使用系统默认的Watcher,系统默认的Watcher是在zookeeper的构造函数中传递的Watcher。如果Watcher为空或者Boolean变量时为false,则表明不注册Watcher。如果获取数据后不需要关注该数据是否变化,就不需要注册Watcher。上面没有返回值的都是异步调用模式。需要注意的是,一旦Watcher被调用后,将会从map中删除,如果还需要关注数据的变化,需要再次注册。 Watcher原理 要搞清楚Watcher的原理,让我们看看Watcher的工作流程。


Watcher的使用与注意事项

 

Watcher需要每次都要注册。

并不是Watcher的节点被修改n次,客户端注册就会被通知n次。如果watcher的节点频繁被修改,有可能修改了10次,客户端被通知8次。如果client与server连接状态发生改变,watcher总是会被通知。


3 一个例子

#include <string.h>
#include <errno.h>

#include "zookeeper.h"

static zhandle_t *zh;

/**
 * In this example this method gets the cert for your
 *   environment -- you must provide
 */
char *foo_get_cert_once(char* id) { return 0; }

/** Watcher function -- empty for this example, not something you should
 * do in real code */
void watcher(zhandle_t *zzh, int type, int state, const char *path,
             void *watcherCtx) {}

int main(int argc, char argv) {
  char buffer[512];
  char p[2048];
  char *cert=0;
  char appId[64];

  strcpy(appId, "example.foo_test");
  cert = foo_get_cert_once(appId);
  if(cert!=0) {
    fprintf(stderr,
            "Certificate for appid [%s] is [%s]\n",appId,cert);
    strncpy(p,cert, sizeof(p)-1);
    free(cert);
  } else {
    fprintf(stderr, "Certificate for appid [%s] not found\n",appId);
    strcpy(p, "dummy");
  }

  zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);

  zh = zookeeper_init("localhost:3181", watcher, 10000, 0, 0, 0);
  if (!zh) {
    return errno;
  }
  if(zoo_add_auth(zh,"foo",p,strlen(p),0,0)!=ZOK)
    return 2;

  struct ACL CREATE_ONLY_ACL[] = {{ZOO_PERM_CREATE, ZOO_AUTH_IDS}};
  struct ACL_vector CREATE_ONLY = {1, CREATE_ONLY_ACL};
  int rc = zoo_create(zh,"/xyz","value", 5, &CREATE_ONLY, ZOO_EPHEMERAL,
                      buffer, sizeof(buffer)-1);

  /** this operation will fail with a ZNOAUTH error */
  int buflen= sizeof(buffer);
  struct Stat stat;
  rc = zoo_get(zh, "/xyz", 0, buffer, &buflen, &stat);
  if (rc) {
    fprintf(stderr, "Error %d for %s\n", rc, __LINE__);
  }

  zookeeper_close(zh);
  return 0;
}


转自:http://zoutm.iteye.com/blog/708468

基于YOLOv5的人脸识别系统:从构建到应用的全流程指南 本文详细介绍了基于YOLOv5的人脸识别系统开发全流程。首先阐述了YOLOv5模型的高效性和准确性优势,随后分步骤讲解了深度学习环境配置、数据集准备(推荐WIDER FACE数据集)和模型训练方法。重点展示了如何将训练好的模型集成到Tkinter开发的GUI界面中,实现图片上传、人脸检测和结果可视化功能。文章提供完整的代码示例和飞书文档链接(密码:946m22&8),帮助开发者快速构建可交互的人脸识别系统,适用于安防、门禁等多种应用场景。通过该项目,读者可掌握YOLOv5的实际应用和界面集成技术。 阅读详情

相关推荐

保姆级教程:在PyCharm里用Continue插件一键接入DeepSeek API(含乱码修复)

本文详细介绍了如何在PyCharm中通过Continue插件无缝集成DeepSeek API,提供从环境准备到高级配置的全流程指南,包括解决常见的乱码问题。通过本教程,开发者可以轻松实现AI编程助手的高效调用,提升代码编写和调试效率。

weixin_30275415的博客 850

避坑指南:解决uC/OS-III移植到STM32时最常见的3个编译错误(附Keil工程)

本文深入解析uC/OS-III移植到STM32平台时最常见的3个编译错误,包括中断优先级配置、头文件路径问题和符号重复定义。通过详细的解决方案和Keil工程配置建议,帮助开发者快速解决移植难题,提升嵌入式开发效率。特别针对ARM Cortex-M架构特性,提供实用的调试技巧和性能优化建议。

weixin_30336061的博客 293

S32的进阶之路->3,S32DS新建/删除/导入工程

右击工程名,点击Delect进行工程删除。选中Delect project contents on disk则会彻底删除工程,不选中Delect project contents on disk工程文件会保存在工作空间中。在Improt Projects中选择工程所在文件夹,选中所需要导入的工程,勾选Copy projects into workspace。选中目标示例工程,点击Finish,完成创建工程。导入已有工程,右击右击Project Explorer空白处,选择Import。

LC_8575的博客 2224

ZooKeeper的常量

STATE常量和EVENT常量 EVENT: ZOO_CREATED_EVENT:标识一个节点被创建的事件。此前节点不存在,通过zoo_exists创建监视。 ZOO_DELETED_EVENT:标识一个节点被删除的事件。当在某节点上创建监视,节点被删除时的事件。通过zoo_exists和zoo_get创建监视 ZOO_CHANGED_EVENT:标识节点发生变化的事件。当在某节点上创...

qq_40123329的博客 718

STM32F407 BootLoader实战:从零搭建到OTA升级(附完整源码)

本文详细介绍了为STM32F407微控制器从零搭建BootLoader并实现稳定OTA升级的完整实战指南。内容涵盖Flash分区规划、链接脚本配置、核心跳转逻辑、中断向量表重定向、可靠的升级流程设计,并深入探讨了双备份与回滚机制以提升工业级可靠性。文章提供了可直接使用的代码框架,并分享了关键调试技巧,帮助开发者快速掌握STM32远程固件更新技术。

weixin_29192211的博客 439

量子密钥分发(QKD)原理、工程实现与实战部署全解析

密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码

weixin_29324401的博客 345

zookeeper总结

ZK简介 zk背景 zookeeper实际上是yahoo开发的,用于分布式中一致性处理的框架。最初其作为研发Hadoop时的副产品。由于分布式系统中一致性处理较为困难,其他的分布式系统没有必要费劲重复造轮子,故随后的分布式系统中大量应用了zookeeper,以至于zookeeper成为了各种分布式系统的基础组件。著名的hadoop、kafka、dubbo 都是基于zookeeper而构建。 ...

m0_37683758的博客 294

【UV打印机】RYPC打印软件教程(二)-软件界面概述

下图是控制软件的主操作界面.将喷绘机的操作规纳为四块,分别为参数设置,任务选择,打印控制,系统维护,对于日常打印而言,只需操作任务选择,打印控制。从而使汲及的操作相对较少,使得系统对普通用户而言简单易用.

Print World的专栏 3600

zookeeper安装

1、下载安装包 weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 方案1:wget是一个下载指令,后面可以跟下载连接去从服务器上下载东西。 方案2:也可以先下载到windows上,再通过xftp传上去。 2、解压 tar.gz文件指令:tar -zxvf 文件名 tar -xvf apache-zookeeper-3.6.3-bin.tar.gz 移动:

qq_61353850的博客 2815

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4663

服务器测试之网卡性能调优

nvidia下载mlnx_ofed:https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/intel下载驱动固件:https://www.intel.com/content/www/us/en/download-center/home.html。然而,你可以根据实际情况手动调整中断相关配置。老生常谈了,一些性能相关的设置项打开,节能的关闭,虚拟化相关的VMX/SR-IOV/IOMMU最好也都关掉。

qq_41897488的博客 4907

dubbo的zookeeper连接、创建节点、订阅

接着上一篇的dubbo的服务发布 上一篇讲完dubbo的远程服务发布之后,到了org.apache.dubbo.registry.integration.RegistryProtocol#export的doLocalExport(originInvoker, providerUrl)调用之后,本篇看一下dubbo在远程服务发布完成之后对zookeeper的连接等操作 一. 创建zk连接 首先进入org.apache.dubbo.registry.integration.RegistryProtocol#g

景川的博客 3408

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 652

zookeeper系列之异步通知模式--Watcher

转载自: http://zoutm.iteye.com/blog/708468 http://blog.youkuaiyun.com/qq910894904/article/details/41726279Watcher介绍:   Watcher是Zookeeper用来实现distribute lock, distribute configure, distribute queue等应用的主要手段。要监控da...

forMelo的博客 387

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ZooKeeper 大流量 Watcher 通知处理机制:从原理到优化的全景解析

事件合并是 ZooKeeper 减少不必要通知的关键策略。当同一个节点在短时间内发生多次变化时,ZooKeeper 并不会为每次变化都触发一次通知,而是只触发一次。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;有事件合并连续多次变化合并为一次事件一次通知无事件合并时间T1: 节点变化通知客户端1时间T2: 节点变化通知客户端2。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1800

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ZooKeeper Watcher 机制详解

ZooKeeper 的 Watcher 机制是分布式系统中用于事件通知的重要功能。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 5222

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ZooKeeper通知机制深度解析:Watcher的工作原理与实现

Watcher是ZooKeeper提供的一种发布/订阅机制,允许客户端注册对特定ZNode的关注,当该节点发生变化时,服务端会主动通知客户端。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;Watcher机制核心1. 注册Watcher2. 存储Watcher3. 触发Watcher4. 发送通知客户端ZooKeeper服务端数据变更。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3281

ZooKeeper Watcher机制

要获取一个节点的数据变化,通常有两种方案: 轮询:实时性差,资源利用率低,浪费大量的 CPU 和 带宽; 事件:数据状态变更时,主动通知 Client,节省大量资源;ZK Server 通过 watcher 监视点,来实现事件通知。 而zk使用的是后一种方案,一个zk服务器集群上的节点Znode发生变化(Znode本身的增加,删除,修改,以及子Znode的变化)就可以通过Watch机制通知到客...

maoyeqiu的专栏 2385

ZooKeeper Watcher(监听机制)

ZooKeeper提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。 ZooKeeper中,引入了Watcher机制来实现这种分布式的通知功能。ZooKeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些事件触发了这个Watche...

王傲旗的大数据之路 6536

Zookeeper(7)Zookeeper的观察者(Watcher)机制是什么?

Zookeeper 的 Watcher 机制是一种高效的事件通知机制,允许客户端监视 ZNode 的数据或状态变化。Watcher 是一次性的,需要在每次事件触发后重新设置。通过上述代码示例,可以看到如何使用 Watcher 机制监视 ZNode 的数据变化,处理 Watcher 事件,并重新设置 Watcher。了解 Watcher 机制有助于在实际应用中实现高效的分布式协调和管理。

qq_43012298的博客 1320

Zookeeper的API调用的同步和异步机制以及watcher机制总结

同步和异步调用 对于zookeeper的所有API调用都提供了正常的同步调用和异步调用两种类型的调用接口,比如zookeeper创建某个目录节点的接口为例: 同步调用接口: String create(final String path, byte data[], List acl,            CreateMode createMode) 异步调用接口: voi

qq838642798的博客 2337

深入理解Zookeeper系列-4.Watcher原理

在分析问题的时候,我们所学的事件的机制、异步化、基于线程的生产者消费者模型,其实它可以在刚刚的场景中去使用,比如我们发起这个请求,他可以将其放置在队列中,通过线程去和对应的接口做远程通信,这时我们可以解决我们这端的并发量的问题,他们第三方在不改变的情况下,我们这端某种程度上提升了一定的吞吐量,然后基于事件的机制就是我们调用第三方接口给返回的时候,基于这个返回结果发送一个通知去告诉调用者结果处理完了,你去拿这个结果做后续的处理。当客户端接收到Watcher通知后,它会根据通知消息中的信息进行相应的处理。

爱吃知识的土豆倪的博客 1186

zookeeper的watcher机制

zookeeper的watcher机制 ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。 ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册一个 Watch...

xxydzyr的博客 1036

ZooKeeper 通知机制是永久有效的吗?深入解析 Watcher 的工作原理

Watcher 是 ZooKeeper 提供的发布/订阅机制,允许客户端注册对特定 ZNode 的关注,当该节点发生变化时,服务端会主动通知客户端。这种机制类似于设计模式中的观察者模式,但进行了分布式环境的优化。问题答案Watcher 是永久有效的吗?不是,是一次性触发为什么设计为一次性?减轻服务端压力、避免重复通知、强制客户端重新获取数据如何实现持续监听?在 process() 中重新注册 Watcher3.5.0+ 版本的新特性?支持持久监听(Persistent Watch)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1931
上一篇: 使用strace+pstack利器分析程序性能
下一篇: 《accelerated c++》第九章---设计类
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值