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

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

[复制链接]

尚未签到

发表于 2015-9-6 08:13:44 | 显示全部楼层 |阅读模式
  上一讲《Zookeeper C API 指南五(同步 API 介绍)》讲了Zookeeper 同步 API 的分类和相关解释,相信大家对 Zookeeper 同步 API 也有了一个大致的了解,本文我会给大家介绍 Zookeeper C API 中的异步调用的函数(即以 zoo_a* 开头的函数),本文大致结构与《Zookeeper C API 指南五(同步 API 介绍)》,先汇总 API,然后再分类,并对每个 API 作出解释。
  在具体讲解 Zookeeper 异步 API 之前,首先回顾一下《Zookeeper C API 指南三(回调函数)》,除了监视器回调函数以外,还有其他 7 种回调函数,他们通常在异步 API 调用结束或 Zookeeper  客户端失去连接时被调用。根据回调函数返回参数(即函数的输出参数)的类型不同分为以下几类:返回 void 类型的回调函数,返回 Stat 结构的回调函数,返回字符串的回调函数,返回数据的回调函数,返回字符串列表(a list of string)的回调函数,同时返回字符串列表(a list of string)和 Stat 结构的回调函数,以及返回 ACL 信息的回调函数,7 中回调函数原型声明如下:



// 返回 void 类型的回调函数
typedef void(* void_completion_t)(int rc, const void *data);
// 返回 Stat 结构的回调函数
typedef void(* stat_completion_t)(int rc, const struct Stat *stat, const void *data);
// 返回字符串的回调函数
typedef void(* string_completion_t)(int rc, const char *value, const void *data);
// 返回数据的回调函数
typedef void(* data_completion_t)(int rc, const char *value, int value_len, const struct Stat *stat, const void *data);
// 返回字符串列表(a list of string)的回调函数
typedef void(* strings_completion_t)(int rc, const struct String_vector *strings, const void *data);
// 同时返回字符串列表(a list of string)和 Stat 结构的回调函数
typedef void(* strings_stat_completion_t)(int rc, const struct String_vector *strings, const struct Stat *stat, const void *data);
// 以及返回 ACL 信息的回调函数
typedef void(* acl_completion_t)(int rc, struct ACL_vector *acl, struct Stat *stat, const void *data);
  可能这么说还不是很理解,那么我们以异步创建 znode 节点(zoo_acreate())为例解释一下:
  zoo_acreate函数原型如下:



ZOOAPI int zoo_acreate(zhandle_t * zh, const char *path,
const char *value, int valuelen,
const struct ACL_vector *acl, int flags,
string_completion_t completion, const void *data);
  其中参数 string_completion_t completion 即返回字符串的回调函数,那么当 zoo_acreate 调用结束时将会触发 completion 回调函数的调用,同时传递给 completion 的 rc 参数为: ZOK 操作完成;ZNONODE 父节点不存在;ZNODEEXISTS 节点已存在;ZNOAUTH 客户端没有权限创建节点。ZNOCHILDRENFOREPHEMERALS 临时节点不能创建子节点。而 string_completion_t completion 中 const char *value 参数即新节点的路径名(注:如果 zoo_acreate 设置了ZOO_EPHEMERAL,则创建节点成功后,节点名称并不是 zoo_acreate 中 path 参数所指定的名称,而是类似与 /xyz0000000001,/xyz0000000002... 的名称)。另外,string_completion_t completion 中 const void *data 参数即为 zoo_acreate 中的 const void *data。
  一般来说,zoo_acreate 函数可以按照以下方式调用:



    int ret = zoo_acreate(zkhandle, "/xyz", "hello", 5,
&ZOO_OPEN_ACL_UNSAFE, 0 /* ZOO_SEQUENCE */,
zktest_string_completion, "acreate");
if (ret) {
fprintf(stderr, "Error %d for %s\n", ret, "acreate");
exit(EXIT_FAILURE);
}
  其中 zktest_string_completion 功能很简单,就是把创建成功后的节点名称打印出来,函数定义如下:



void zktest_string_completion(int rc, const char *name, const void *data)
{
fprintf(stderr, "[%s]: rc = %d\n", (char*)(data==0?"null":data), rc);
if (!rc) {
fprintf(stderr, "\tname = %s\n", name);
}
}
  好了,有了上面的基础,我们接下来再来讲讲 Zookeeper 异步 API 吧 :-)
  Zookeeper C API 中与访问 Zookeeper 服务相关(比如创建、删除 znode 节点,获取子节点,设置 znode 数据等)的异步 API 如下:



ZOOAPI int zoo_acreate(zhandle_t * zh, const char *path,
const char *value, int valuelen,
const struct ACL_vector *acl, int flags,
string_completion_t completion, const void *data);
ZOOAPI int zoo_adelete(zhandle_t * zh, const char *path, int version,
void_completion_t completion, const void *data);
ZOOAPI int zoo_aexists(zhandle_t * zh, const char *path, int watch,
stat_completion_t completion, const void *data);
ZOOAPI int zoo_awexists(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
stat_completion_t completion, const void *data);
ZOOAPI int zoo_aget(zhandle_t * zh, const char *path, int watch,
data_completion_t completion, const void *data);
ZOOAPI int zoo_awget(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
data_completion_t completion, const void *data);
ZOOAPI int zoo_aset(zhandle_t * zh, const char *path,
const char *buffer, int buflen, int version,
stat_completion_t completion, const void *data);
ZOOAPI int zoo_aget_children(zhandle_t * zh, const char *path,
int watch,
strings_completion_t completion,
const void *data);
ZOOAPI int zoo_awget_children(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_completion_t completion,
const void *data);
ZOOAPI int zoo_aget_children2(zhandle_t * zh, const char *path,
int watch,
strings_stat_completion_t completion,
const void *data);
ZOOAPI int zoo_awget_children2(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_stat_completion_t completion,
const void *data);
ZOOAPI int zoo_async(zhandle_t * zh, const char *path,
string_completion_t completion, const void *data);
ZOOAPI int zoo_aget_acl(zhandle_t * zh, const char *path,
acl_completion_t completion, const void *data);
ZOOAPI int zoo_aset_acl(zhandle_t * zh, const char *path, int version,
struct ACL_vector *acl, void_completion_t,
const void *data);
ZOOAPI int zoo_amulti(zhandle_t * zh, int count, const zoo_op_t * ops,
zoo_op_result_t * results, void_completion_t,
const void *data);
  本文将以上异步 API 细分为以下几类:(1). 创建、删除 znode 节点,(2). 可设置 watch 的 API,(3). 访问、设置节点 ACL 的 API,(4). 异步批处理 API。


  • 创建、删除 znode 节点



ZOOAPI int zoo_acreate(zhandle_t * zh, const char *path,
const char *value, int valuelen,
const struct ACL_vector *acl, int flags,
string_completion_t completion, const void *data);
ZOOAPI int zoo_adelete(zhandle_t * zh, const char *path, int version,
void_completion_t completion, const void *data);

  • 创建 znode 节点



ZOOAPI int zoo_acreate(zhandle_t * zh, const char *path,
const char *value, int valuelen,
const struct ACL_vector *acl, int flags,
string_completion_t completion, const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
value该节点保存的数据。
valuelen该节点保存数据的大小。
acl该节点初始 ACL,ACL 不能为null 或空。
flags该参数可以设置为 0,或者创建标识符 ZOO_EPHEMERAL, ZOO_SEQUENCE 的组合或(OR)。
completion当创建节点请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 父节点不存在;ZNODEEXISTS 节点已存在;ZNOAUTH 客户端没有权限创建节点。ZNOCHILDRENFOREPHEMERALS 临时节点不能创建子节点。
datacompletion 函数被调用时,传递给 completion 的数据。


  • 删除 znode 节点



ZOOAPI int zoo_adelete(zhandle_t * zh, const char *path, int version,
void_completion_t completion, const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
version期望的节点版本号,如果真实的版本号与期望的版本号不同则 zoo_delete() 调用失败,-1 表示不不检查版本号。
completion当删除节点请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点;ZBADVERSION 版包号不匹配;ZNOTEMPTY 当前节点存在子节点,不能被删除。
datacompletion 函数被调用时,传递给 completion 的数据。
  


  • 可设置 watch 的 API(exists(两个) + get(两个) + get_children(四个) = 八个)



ZOOAPI int zoo_aexists(zhandle_t * zh, const char *path, int watch,
stat_completion_t completion, const void *data);
ZOOAPI int zoo_awexists(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
stat_completion_t completion, const void *data);
ZOOAPI int zoo_aget(zhandle_t * zh, const char *path, int watch,
data_completion_t completion, const void *data);
ZOOAPI int zoo_awget(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
data_completion_t completion, const void *data);
ZOOAPI int zoo_aget_children(zhandle_t * zh, const char *path,
int watch,
strings_completion_t completion,
const void *data);
ZOOAPI int zoo_awget_children(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_completion_t completion,
const void *data);
ZOOAPI int zoo_aget_children2(zhandle_t * zh, const char *path,
int watch,
strings_stat_completion_t completion,
const void *data);
ZOOAPI int zoo_awget_children2(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_stat_completion_t completion,
const void *data);

  • 检查节点状态 exists(两个,分别是 zoo_aexists() 和 zoo_awexists(),区别是后者可以指定单独的 watcher_fn(监视器回调函数),而前者只能用 zookeeper_init() 设置的全局监视器回调函数,同时 aget 和 aget_children两族函数也一样,带有zoo_w* 的函数可以指定单独的 watcher_fn)。)



ZOOAPI int zoo_aexists(zhandle_t * zh, const char *path, int watch,
stat_completion_t completion, const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watch如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
completion当 zoo_aexists 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  



ZOOAPI int zoo_awexists(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
stat_completion_t completion, const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watcher如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
watcherCtx用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
completionzoo_awexists 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  


  • 获取节点数据 aget(两个)



ZOOAPI int zoo_aget(zhandle_t * zh, const char *path, int watch,
data_completion_t completion, const void *data);

zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watch如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知。
completionzoo_aget 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  



ZOOAPI int zoo_awget(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
data_completion_t completion, const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watcher如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
watcherCtx用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
completionzoo_awget 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  


  • 获取子节点列表 aget_children (四个)



ZOOAPI int zoo_aget_children(zhandle_t * zh, const char *path,
int watch,
strings_completion_t completion,
const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watch如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知。
completion当 zoo_aget_children 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  



ZOOAPI int zoo_awget_children(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_completion_t completion,
const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watcher如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
watcherCtx用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
completion当zoo_awget_children 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  



ZOOAPI int zoo_aget_children2(zhandle_t * zh, const char *path,
int watch,
strings_stat_completion_t completion,
const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watch如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知。
completion当 zoo_aget_children2 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  



ZOOAPI int zoo_awget_children2(zhandle_t * zh, const char *path,
watcher_fn watcher, void *watcherCtx,
strings_stat_completion_t completion,
const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
watcher如果非 0,则在服务器端设置监视,当节点发生变化时客户端会得到通知,即使当前指定的节点不存在也会设置监视,这样该节点被创建时,客户端也可以得到通知。
watcherCtx用户指定的数据,将被传入到监视器回调函数中,与由 zookeeper_init() 设置的全局监视器上下文不同,该函数设置的监视器上下文只与当前的监视器相关联。
completion当zoo_awget_children2 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  


  • 访问、设置节点 ACL 的 API



ZOOAPI int zoo_aget_acl(zhandle_t * zh, const char *path,
acl_completion_t completion, const void *data);
ZOOAPI int zoo_aset_acl(zhandle_t * zh, const char *path, int version,
struct ACL_vector *acl, void_completion_t,
const void *data);

  • 访问节点 ACL



ZOOAPI int zoo_aget_acl(zhandle_t * zh, const char *path,
acl_completion_t completion, const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
completion当 zoo_aget_acl 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点。
datacompletion 函数被调用时,传递给 completion 的数据。
  


  • 设置节点 ACL



ZOOAPI int zoo_aset_acl(zhandle_t * zh, const char *path, int version,
struct ACL_vector *acl, void_completion_t,
const void *data);
zhzookeeper_init() 返回的 zookeeper 句柄。
path节点路径。
buffer保存需要设置的 ACL。
buflenbuffer 的长度。
completion当 zoo_aset_acl 请求完成时会调用该函数,该函数原型详见第三讲《回调函数》一节。同时传递给completion的 rc参数为: ZOK 操作完成;ZNONODE 节点不存在;ZNOAUTH 客户端没有权限删除节点;ZINVALIDACL 非法 ACL;ZBADVERSION 版本号不匹配。
datacompletion 函数被调用时,传递给 completion 的数据。
  


  • 异步批处理 API



ZOOAPI int zoo_amulti(zhandle_t * zh, int count, const zoo_op_t * ops,
zoo_op_result_t * results, void_completion_t,
const void *data);
  异步批处理与同步批处理方式类似见《Zookeeper C API 指南五(同步 API 介绍)》,只是需要额外设置一个 void_completion_t 回调函数,在此不再赘述。
  
  以上内容是 Zookeeper  C API 中异步 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-109869-1-1.html 上篇帖子: ZooKeeper学习第四期---构建ZooKeeper应用 下篇帖子: zookeeper kazoo Basic Usage
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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