设为首页 收藏本站
查看: 1266|回复: 0

[经验分享] Zookeeper C API 指南五(同步 API 介绍)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-6 03:08:01 | 显示全部楼层 |阅读模式
  上一讲《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);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
value该节点保存的数据。
valuelen该节点保存数据的大小。如果 value 被设置为 NULL(该 znode 节点不包含数据),则 valuelen 应该设置为 -1。
acl该节点初始 ACL,ACL 不能为null 或空。
flags该参数可以设置为 0,或者创建标识符 ZOO_EPHEMERAL, ZOO_SEQUENCE 的组合或(OR)。
path_buffer用于保存返回节点新路径(因为设置了 ZOO_SEQUENCE 后 zoo_create 所创建的节点名称与参数 path 提供的名称不同,新的节点名称后面填充了序号),path 字符串以 NULL 结束。path_buffer 可以设置为 NULL,此时 path_buffer_len 等于 0。
path_buffer_lenpath_buffer 的长度,如果新节点名称的长度大于path_buffer_len,则节点名称将会被截断,而服务器端该节点的名称不会截断。


  • 删除 znode 节点:



ZOOAPI int zoo_delete(zhandle_t * zh, const char *path, int version);
zhzookeeper_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);
zhzookeeper_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);
zhzookeeper_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);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watch如果非0,则在服务器端设置监视,当节点发生变化时客户端会得到通知
buffer用于保存从 zookeeper 服务器获取的节点数据。
buffer_lenbuffer 大小,一旦成功返回该值将会被设置为节点数据的实际大小,如果节点的数据为空,则数据大小为 -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);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watcher如果不为 NULL 则会在服务器端设置监视,当节点发生变化时客户端会得到通知
watcherCtx用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
buffer用于保存从 zookeeper 服务器获取的节点数据。
buffer_lenbuffer 大小,一旦成功返回该值将会被设置为节点数据的实际大小,如果节点的数据为空,则数据大小为 -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);
zhzookeeper_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);
zhzookeeper_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 信息。

zhzookeeper_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 信息。

zhzookeeper_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);
zhzookeeper_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);
zhzookeeper_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);
zhzookeeper_init() 返回的 zookeeper 句柄。
count提交操作的个数。
ops包含所提交操作数组。
results包含操作所返回结果的数组。
  其中 zoo_op_t 是各种操作(创建、删除节点,设置节点数据和检查节点状态四种操作)一个封装(联合体),定义如下:



typedef struct zoo_op {
int type;
union {
// CREATE
struct {
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;
// SET
struct {
const char *path;
const char *data;
int datalen;
int version;
struct Stat *stat;
} set_op;
// CHECK
struct {
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 介绍)》。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-109826-1-1.html 上篇帖子: zookeeper windows安装和使用 下篇帖子: zookeeper的领导者选举和原子广播
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表