參考 include/zookeeper.h
Watches
1)Zookeeper 所有的讀操作——getData(), getChildren(), 和 exists() 都 可以設定監視(watch),監視事件可以理解為一次性的觸發器
2)用戶端只有首先看到了監視事件後,才會感知到它所設定監視的 znode 發生了變化
3)資料監視和子節點監視(data watches and child watches) getData() and exists() 設定資料監視,getChildren() 設定子節點監視
因此, setData() 會觸發設定在某一節點上所設定的資料監視(假定資料設定成功),而一次成功的 create() 操作則會出發當前節點上所設定的資料監視以及父節點的子節點監視。一次成功的 delete() 操作將會觸發當前節點的資料監視和子節點監視事件,同時也會觸發該節點父節點的child watch。
=======================================================================================================================
與 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;//允許用戶端執行所有操作,等價與上述所有標誌的或(OR) 。
與 ACL IDs 相關的常量
•struct Id ZOO_ANYONE_ID_UNSAFE; //(‘world’,’anyone’)
•struct Id ZOO_AUTH_IDS;// (‘auth’,’’)
三種標準的 ACL
•struct ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_ALL,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)
zoo_create 函數標誌,ZOO_EPHEMERAL 用來標識建立臨時節點,ZOO_SEQUENCE 用來標識節點命名具有遞增的尾碼序號
=======================================================================================================================
Zookeeper C 常用傳回值
ZOK 正常返回
ZCONNECTIONLOSS Zookeeper 用戶端與伺服器端失去串連
ZNONODE 節點不存在(Node does not exist)
ZNOAUTH 沒有經過授權(Not authenticated)
ZNOCHILDRENFOREPHEMERALS 臨時節點不能擁有子節點(Ephemeral nodes may not have children)
ZNODEEXISTS 節點已經存在(The node already exists)
ZNOTEMPTY 該節點具有自身的子節點(The node has children)
ZSESSIONEXPIRED 會話到期(The session has been expired by the server)
ZINVALIDCALLBACK 非法的回呼函數(Invalid callback specified)
ZINVALIDACL 非法的ACL(Invalid ACL specified)
ZAUTHFAILED 用戶端授權失敗(Client authentication failed)
ZCLOSING Zookeeper 串連關閉(ZooKeeper is closing)
=======================================================================================================================
與監視類型(Watch Types)相關的常量
以下常量標識監視事件的類型,他們通常用作監視器回呼函數的第一個參數。
•ZOO_CREATED_EVENT; // 節點被建立(此前該節點不存在),通過 zoo_exists() 設定監視。
•ZOO_DELETED_EVENT; // 節點被刪除,通過 zoo_exists() 和 zoo_get() 設定監視。
•ZOO_CHANGED_EVENT; // 節點發生變化,通過 zoo_exists() 和 zoo_get() 設定監視。
•ZOO_CHILD_EVENT; // 子節點事件,通過zoo_get_children() 和 zoo_get_children2()設定監視。
•ZOO_SESSION_EVENT; // 會話丟失
•ZOO_NOTWATCHING_EVENT; // 監視被移除。
=======================================================================================================================
與串連狀態 Stat 相關的常量
以下常量均與 Zookeeper 串連狀態有關,他們通常用作監視器回呼函數的參數。
ZOOAPI const int ZOO_EXPIRED_SESSION_STATE
ZOOAPI const int ZOO_AUTH_FAILED_STATE
ZOOAPI const int ZOO_CONNECTING_STATE
ZOOAPI const int ZOO_ASSOCIATING_STATE
ZOOAPI const int ZOO_CONNECTED_STATE
=======================================================================================================================
typedef void (*watcher_fn)(zhandle_t *zh, int type, int state, const char *path,void *watcherCtx);
監視函數原型的各個參數解釋如下:
zh zookeeper 控制代碼(handle)
type 事件類型(event type). *_EVENT 常量之一.
state 串連狀態(connection state). 狀態值為 *_STATE 常量之一.
path 觸發監視事件的 znode 節點的路徑,若為 NULL,則事件類型為 ZOO_SESSION_EVENT
watcherCtx 監視器上下文(watcher context).
=======================================================================================================================
一些注意:
zoo_init是一個非同步函數,如果緊接著有需要stat狀態非零的參數,需進行初始化等待的操作。
一般而言,定義兩種以上的watcher,其中一個watcher是專門用來監視初始化和關閉狀態的。
同步和非同步兩套介面需要看情況使用,同步的效率沒有非同步高,但是保證了結果。