转载地址:https://www.cnblogs.com/haippy/archive/2013/02/21/2920426.html

上一讲《Zookeeper C API 指南四(C API 概览)》讲了Zookeeper C API 的分类和几个基本函数的用法,相信大家对 Zookeeper C API 也有了一个大致的了解,本文我会给大家介绍 Zookeeper C API 中的同步调用的函数(即以 zoo_* 开头的函数)。

Zookeeper C API 中与访问 Zookeeper 服务相关(比如创建、删除 znode 节点,获取子节点,设置 znode 数据等)的同步 API 如下:

ZOOAPI int zoo_add_auth(zhandle_t * zh, const char *scheme,const char *cert, int certLen,void_completion_t completion, const void *data);ZOOAPI int zoo_create(zhandle_t * zh, const char *path,const char *value, int valuelen,const struct ACL_vector *acl, int flags,char *path_buffer, int path_buffer_len);ZOOAPI int zoo_delete(zhandle_t * zh, const char *path, int version);ZOOAPI int zoo_exists(zhandle_t * zh, const char *path, int watch,struct Stat *stat);ZOOAPI int zoo_wexists(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct Stat *stat);ZOOAPI int zoo_get(zhandle_t * zh, const char *path, int watch,char *buffer, int *buffer_len, struct Stat *stat);ZOOAPI int zoo_wget(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,char *buffer, int *buffer_len, struct Stat *stat);ZOOAPI int zoo_set(zhandle_t * zh, const char *path,const char *buffer, int buflen, int version);ZOOAPI int zoo_set2(zhandle_t * zh, const char *path,const char *buffer, int buflen, int version,struct Stat *stat);ZOOAPI int zoo_get_children(zhandle_t * zh, const char *path,int watch, struct String_vector *strings);ZOOAPI int zoo_wget_children(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct String_vector *strings);ZOOAPI int zoo_get_children2(zhandle_t * zh, const char *path,int watch, struct String_vector *strings,struct Stat *stat);ZOOAPI int zoo_wget_children2(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct String_vector *strings,struct Stat *stat);ZOOAPI int zoo_get_acl(zhandle_t * zh, const char *path,struct ACL_vector *acl, struct Stat *stat);ZOOAPI int zoo_set_acl(zhandle_t * zh, const char *path, int version,const struct ACL_vector *acl);ZOOAPI int zoo_multi(zhandle_t * zh, int count, const zoo_op_t * ops,zoo_op_result_t * results);

本文将以上同步 API 在此细分为一下几类:(1). 创建、删除 znode 节点,(2). 可设置 watch 的 API,(3). 访问、设置节点 ACL 的 API,(4). 批处理 API

  • 创建、删除 znode 节点(两个)

ZOOAPI int zoo_create(zhandle_t * zh, const char *path,const char *value, int valuelen,const struct ACL_vector *acl, int flags,char *path_buffer, int path_buffer_len);ZOOAPI int zoo_delete(zhandle_t * zh, const char *path, int version);

  • 创建 znode 节点:
ZOOAPI int zoo_create(zhandle_t * zh, const char *path,const char *value, int valuelen,const struct ACL_vector *acl, int flags,char *path_buffer, int path_buffer_len);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
value 该节点保存的数据。
valuelen 该节点保存数据的大小。如果 value 被设置为 NULL(该 znode 节点不包含数据),则 valuelen 应该设置为 -1。
acl 该节点初始 ACL,ACL 不能为null 或空。
flags 该参数可以设置为 0,或者创建标识符 ZOO_EPHEMERALZOO_SEQUENCE 的组合或(OR)。
path_buffer 用于保存返回节点新路径(因为设置了 ZOO_SEQUENCE 后 zoo_create 所创建的节点名称与参数 path 提供的名称不同,新的节点名称后面填充了序号),path 字符串以 NULL 结束。path_buffer 可以设置为 NULL,此时 path_buffer_len 等于 0。
path_buffer_len path_buffer 的长度,如果新节点名称的长度大于path_buffer_len,则节点名称将会被截断,而服务器端该节点的名称不会截断。
  • 删除 znode 节点:
ZOOAPI int zoo_delete(zhandle_t * zh, const char *path, int version);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
version 节点的版本号,如果该 znode 节点的实际版本号与该参数提供的版本号不一值,则删除节点失败,如果 version 为 -1,则不作版本检查。
  • 可设置 watch 的 API(exists(两个) + get(两个) + get_children(四个) = 八个)

ZOOAPI int zoo_exists(zhandle_t * zh, const char *path, int watch,struct Stat *stat);ZOOAPI int zoo_wexists(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct Stat *stat);ZOOAPI int zoo_get(zhandle_t * zh, const char *path, int watch,char *buffer, int *buffer_len, struct Stat *stat);ZOOAPI int zoo_wget(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,char *buffer, int *buffer_len, struct Stat *stat);ZOOAPI int zoo_get_children(zhandle_t * zh, const char *path,int watch, struct String_vector *strings);ZOOAPI int zoo_wget_children(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct String_vector *strings);ZOOAPI int zoo_get_children2(zhandle_t * zh, const char *path,int watch, struct String_vector *strings,struct Stat *stat);ZOOAPI int zoo_wget_children2(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct String_vector *strings,struct Stat *stat);

  • 检查节点状态 exists(两个,分别是 zoo_exists() 和 zoo_wexists(),区别是后者可以指定单独的 watcher_fn(监视器回调函数),而前者只能用 zookeeper_init() 设置的全局监视器回调函数,同时 get 和 get_children两族函数也一样,带有zoo_w* 的函数可以指定单独的 watcher_fn)。
ZOOAPI int zoo_exists(zhandle_t * zh, const char *path, int watch, struct Stat *stat);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watch 如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
stat 返回的 Stat 信息。
ZOOAPI int zoo_wexists(zhandle_t * zh, const char *path, watcher_fn watcher, void *watcherCtx,struct Stat *stat);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watcher 如果不为 NULL 则会在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
watcherCtx 用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
stat 返回的 Stat 信息。
  • 获取节点数据 get(两个)
ZOOAPI int zoo_get(zhandle_t * zh, const char *path, int watch,char *buffer, int *buffer_len, struct Stat *stat);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watch 如果非0,则在服务器端设置监视,当节点发生变化时客户端会得到通知。
buffer 用于保存从 zookeeper 服务器获取的节点数据。
buffer_len buffer 大小,一旦成功返回该值将会被设置为节点数据的实际大小,如果节点的数据为空,则数据大小为 -1,buffer_len 也为 -1。
stat 如果非空,stat 指向的结构将会保存该节点的 Stat 信息。
ZOOAPI int zoo_wget(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,char *buffer, int *buffer_len, struct Stat *stat);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watcher 如果不为 NULL 则会在服务器端设置监视,当节点发生变化时客户端会得到通知
watcherCtx 用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
buffer 用于保存从 zookeeper 服务器获取的节点数据。
buffer_len buffer 大小,一旦成功返回该值将会被设置为节点数据的实际大小,如果节点的数据为空,则数据大小为 -1,buffer_len 也为 -1。
stat 如果非空,stat 指向的结构将会保存该节点的 Stat 信息。
  • 获取子节点列表 get_children(四个)
ZOOAPI int zoo_get_children(zhandle_t * zh, const char *path,int watch, struct String_vector *strings);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watch 如果非0,则在服务器端设置监视,当节点发生变化时客户端会得到通知
strings 返回各个子节点路径
ZOOAPI int zoo_wget_children(zhandle_t * zh, const char *path, watcher_fn watcher, void *watcherCtx,struct String_vector *strings);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watcher 如果不为 NULL 则会在服务器端设置监视,当节点发生变化时客户端会得到通知
watcherCtx 用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
strings 回各个子节点路径
ZOOAPI int zoo_get_children2(zhandle_t * zh, const char *path, int watch, struct String_vector *strings,struct Stat *stat);

该函数最早出现在 Zookeeper 3.3.0中,该函数功能与 zoo_get_children() 基本一致,但同时还会返回指定节点的 Stat 信息。

zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watch 如果非0,则在服务器端设置监视,当节点发生变化时客户端会得到通知
strings 返回各个子节点路径。
stat 返回指定节点的 Stat 信息。
ZOOAPI int zoo_wget_children2(zhandle_t * zh, const char *path,watcher_fn watcher, void *watcherCtx,struct String_vector *strings,struct Stat *stat);

该函数最早出现在 Zookeeper 3.3.0中,该函数功能与 zoo_wget_children() 基本一致,但同时还会返回指定节点的 Stat 信息。

zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
watcher 如果不为 NULL 则会在服务器端设置监视,当节点发生变化时客户端会得到通知
watcherCtx 用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
strings 返回各个子节点路径。
stat 返回指定节点的 Stat 信息。
  • 访问、设置节点 ACL (两个)
ZOOAPI int zoo_get_acl(zhandle_t * zh, const char *path, struct ACL_vector *acl, struct Stat *stat);ZOOAPI int zoo_set_acl(zhandle_t * zh, const char *path, int version, const struct ACL_vector *acl);
  • 获取节点 ACL 信息
ZOOAPI int zoo_get_acl(zhandle_t * zh, const char *path, struct ACL_vector *acl, struct Stat *stat);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
acl 该函数所返回的指定节点的 ACL 信息。
stat 返回指定节点的 Stat 信息。
  • 设置节点 ACL
ZOOAPI int zoo_set_acl(zhandle_t * zh, const char *path, int version, const struct ACL_vector *acl);
zh zookeeper_init() 返回的 zookeeper 句柄。
path 节点路径。
version 节点的版本号。
acl 需要设置的 ACL 信息。
  • 批处理,即原子性地一次提交多个 Zookeeper 操作。
ZOOAPI int zoo_multi(zhandle_t * zh, int count, const zoo_op_t * ops, zoo_op_result_t * results);
zh zookeeper_init() 返回的 zookeeper 句柄。
count 提交操作的个数。
ops 包含所提交操作数组。
results 包含操作所返回结果的数组。

其中 zoo_op_t 是各种操作(创建、删除节点,设置节点数据和检查节点状态四种操作)一个封装(联合体),定义如下:

typedef struct zoo_op {int type;union {// CREATEstruct {const char *path;const char *data;int datalen;char *buf;int buflen;const struct ACL_vector *acl;int flags;} create_op;// DELETE struct {const char *path;int version;} delete_op;// SETstruct {const char *path;const char *data;int datalen;int version;struct Stat *stat;} set_op;// CHECKstruct {const char *path;int version;} check_op;};
} zoo_op_t;

zoo_op_t 一般由以下四个函数初始化:

void zoo_create_op_init(zoo_op_t * op, const char *path, const char *value,int valuelen, const struct ACL_vector *acl,int flags, char *path_buffer, int path_buffer_len);void zoo_delete_op_init(zoo_op_t * op, const char *path, int version);void zoo_set_op_init(zoo_op_t * op, const char *path,const char *buffer, int buflen, int version,struct Stat *stat);void zoo_check_op_init(zoo_op_t * op, const char *path, int version);

zoo_op_result_t 用于保存 zoo_multi 或者 zoo_amulti 返回的其中一个结果,定义如下:

typedef struct zoo_op_result {int err;char *value;int valuelen;struct Stat *stat;
} zoo_op_result_t; 

以上内容是 Zookeeper  C API 中同步 API 的介绍,如有错误请留下您的想法和意见,本人会尽快更正;同时,我也将在后面的文章中列举一些示例来说明上述 API 的用法,如有兴趣请继续关注,如果您需要了解 Zookeeper 异步 API,请移步第六讲《Zookeeper C API 指南六(异步 API 介绍)》。

Zookeeper C API 指南五(同步 API 介绍)相关推荐

  1. Zookeeper C API 指南六(异步 API 介绍)

    转载地址:https://www.cnblogs.com/haippy/archive/2013/02/21/2920426.html 上一讲<Zookeeper C API 指南五(同步 AP ...

  2. Zookeeper C API 指南

    以前自己的博客中转载.翻译或写过(不过自己才疏学浅,写的不好)一些 Zookeeper 方面的文章,但是都没有涉及到 Zookeeper C API 的内容,今天的这篇博客是我农历新年的第一篇技术博客 ...

  3. Zookeeper C 同步 API 介绍

    Zookeeper C API 中与访问 Zookeeper 服务相关(比如创建.删除 znode 节点,获取子节点,设置 znode 数据等)的同步 API 如下: ZOOAPI int zoo_a ...

  4. Zookeeper C API 指南一(转)

    Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...

  5. 阿里云API网关(6)用户指南(开放 API )

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  6. trident API指南

    trident API指南 @(STORM)[storm] trident API指南 零 概述 1 本地分区操作 2 重新分区操作 3 聚合操作 4 流分组操作 5合并与连接 一 本地分区操作 一 ...

  7. Microsoft REST API指南

    经过3个月的碎片时间的翻译和校验,由长沙.NET技术社区翻译的英文原文文档<Microsoft REST API指南 >已经翻译完成,现刊载前十一章如下,欢迎大家点击"查看原文& ...

  8. jqMobi学习笔记----中文API指南

    原文出处:http://www.xuebuyuan.com/1975792.html JavascriptFrameworks Cheat Sheet> 的中文版,详细介绍了jqMobi. jq ...

  9. sqoop2 java api实现_Sqoop2 Java客户端API指南

    原文连接:http://sqoop.apache.org/docs/1.99.6/ClientAPI.html Sqoop Java客户端API指南 这篇文章秒描述了额如何在外部应用中使用sqoop ...

  10. RPC-非阻塞通信下的同步API实现原理,以Dubbo为例

    Netty在Java NIO领域基本算是独占鳌头,涉及到高性能网络通信,基本都会以Netty为底层通信框架,Dubbo 也不例外.以下将以Dubbo实现为例介绍其是如何在NIO非阻塞通信基础上实现同步 ...

最新文章

  1. 使用webpack打包后,vscode中vue代码变白色的解决办法
  2. telegram 创建机器人
  3. 软件调试学习笔记(四)—— 异常的处理流程
  4. script id=tp type=text/html,demo.html
  5. 速达服务器账套定期维护么,速达软件常见操作问题解决方法
  6. 315. Count of Smaller Numbers After Self
  7. python类的定义和创建_Python类对象的创建和使用
  8. C++ Templates之模板元编程
  9. 关于Java的Object.clone()方法与对象的深浅拷贝,java面试题,java初级笔试题
  10. Kubernetes生态系统与演进路线
  11. CSS完美实现垂直居中-测试页
  12. 内存优化最后一弹——优化函数运行
  13. 数据统计分析(1):数据分析流程
  14. Revit二次开发入门
  15. vlan间路由+静态路由+NAT(PAT+静态NAT)综合实验
  16. QGIS3.20 制作栅格动画
  17. 在入口文件main.js引入styl报错,不断修改后运行正常了
  18. SSM实现秒杀系统案例
  19. 什么是IaaS PaaS SaaS,看这一篇就够了
  20. java微信多客服_微信多客服聊天功能怎么实现?

热门文章

  1. Hue添加Spark notebook
  2. 对Windows学习的总结
  3. Mysql5.7中文乱码
  4. HCIE-Security Day29:IPSec:实验(四)总部与分支机构之间建立IPSec PN(采用策略模板方式,总部采用固定IP)
  5. BGP选路规则和负载分担
  6. Linux四剑客详解——awk
  7. 一文看懂BGP路由黑洞问题
  8. MySQL 第七次练习(存储过程函数)
  9. Leetcode 刷题笔记(二十六) ——动态规划篇之经典问题:打家劫舍
  10. IdleHandler,页面启动优化神器