Zookeeper C API之监视(Watch)、常量和结构体

1、监视(Watch)简介
Zookeeper C API的声明和描述定义在文件include/zookeeper.h中,大部分的常量、结构体声明也定义在这个文件中。
Zookeeper所有的读操作(包括:getData()、getChildren()和exists())度可以设置Watch,watch事件是一次性的触发器(官方定义: a watch event is one-time trigger, sent to the client that set the watch, which occurs when the data for which the watch was set changes):

 - 一次性触发(One-time trigger):当设置watch的数据发生改变时,监视事件会被发送到客户端。比如:客户端调用了getData(“/znode1”, true)并且稍后/znode1节点上数据发生变化或被删除,客户端会收到/znode1发生变化的监视事件,而如果/znode1再次发生变化,除非客户端再次对/znode1设置watch,否则客户端是不会收到事件通知的。
 - 发送至客户端(Sent to the client):客户端和服务器之间是通过socket通信的,如果网络存在故障,则客户端可能收不到watch事件。watch事件是异步发送至监视者的,zookeeper本身提供保序性:即客户端只有收到了监视事件后才会感知znode发生了变化。网络延迟或其他因素可能导致不同的客户端在不同的时刻感知watch事件,但是不同的客户端所看到的一切具有一致的顺序。
 - 被设置watch的数据(The data for which the watch was set):znode节点本身有不同的改变方式。Zookeeper维护了两个监视链表:数据监视和子节点监视,getData()和exists()设置数据监视,getChildren()设置子节点监视。不同的监视返回不同的数据,getData()和exists()返回znode节点的相关信息,而getChildren()返回子节点列表。因此,setData()会触发设置在节点上的数据监视,而一次成功的create()操作则会触发节点上设置的数据监视和父节点的子节点监视,一次成功的delete()操作会触发节点的数据监视和子节点watch事件,同时也会触发该节点父节点的子节点watch事件。

注:watch事件丢失的可能情况:通过exists()设置了某个znode节点的watch,如果客户端在此znode节点被创建或删除的时间间隔内与zookeeper服务器失去联系,那么客户端重新连接zookeeper服务器之后也收不到watch事件通知。

2、结构体
struct Id结构:

struct Id{ char *scheme; char *id; };

struct ACL结构:

struct ACL{ int32_t perms; struct Id id; };

struct ACL_vector结构:

struct ACL_vector{ int32_t count; struct ACL *data; };

3、常量
与znode访问权限有关的常量:

const int ZOO_PERM_READ; //允许客户端读取znode节点的值以及子节点列表
const int ZOO_PERM_WRITE; //允许客户端设置znode节点的值
const int ZOO_PERM_CREATE; //允许客户端在znode节点下创建子节点
const int ZOO_PERM_DELETE; //允许客户端删除子节点
const int ZOO_PERM_ADMIN; //允许客户端执行set_acl()
const int ZOO_PERM_ALL; //允许客户端执行所有操作

与ACL IDs相关的常量:

扫描二维码关注公众号,回复: 4111262 查看本文章

struct Id ZOO_ANYONE_ID_UNSAFE; //(‘world’,’anyone’)
struct Id ZOO_AUTH_IDS; // (‘auth’)

三个标准的ACL:

struct ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_AL, ZOO_ANYONE_ID_UNSAFE)
struct ACL_vector ZOO_READ_ACL_UNSAFE; //(ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)
struct ACL_vector ZOO_CREATOR_ALL_ACL; //(ZOO_PERM_ALL, ZOO_AUTH_IDS)

与Interest相关的常量:ZOOKEEPER_WRITE、ZOOKEEPER_READ

用于标识感兴趣的事件,并通知zookeeper发生了哪些事件。
Interest常量可以进行组合或(OR)来标识多种兴趣,一般用于zookeeper_interest()和zookeeper_process()两个函数中

与节点创建相关的常量:ZOO_EPHEMERAL、ZOO_SEQUENCE

zoo_create函数标志,ZOO_EPHEMERAL用来标识创建临时节点,ZOO_SEQUENCE用来标识节点命名具有递增的后缀序号(一般是节点名称后填充10位字符的序号,比如:/xyz0000000001,/xyz0000000002,…)。
ZOO_EPHEMERAL和ZOO_SEQUENCE也可以通过OR组合。

与连接状态Stat相关的常量:通常用作监视器回调函数的参数。

ZOO API const int ZOO_EXPIRED_SESSION_STATE
ZOO API const int ZOO_AUTH_FAILED_STATE
ZOO API const int ZOO_CONNECTING_STATE
ZOO API const int ZOO_ASSOCIATING_STATE
ZOO API const int ZOO_CONNECTED_STATE

与监视类型(Watch Types)相关的常量:通常用作监视器回调函数的第一个参数。

ZOO_CREATED_EVENT; //节点创建,通过zoo_exists()设置监视
ZOO_DELETED_EVENT; //节点删除,通过zoo_exists()设置监视
ZOO_CHANGED_EVENT; //节点发生变化,通过zoo_exists()和zoo_get()设置监视
ZOO_CHILD_EVENT; //子节点事件,通过zoo_children()设置监视
ZOO_SESSION_EVENT; //会话丢失
ZOO_NOTWATCHING_EVENT; //监视移除

猜你喜欢

转载自blog.csdn.net/qq_41688455/article/details/83660191