Zookeeper C 同步 API 介紹

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_EPHEMERALZOO_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; 
複製代碼

 

發佈了211 篇原創文章 · 獲贊 514 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章