1. 程式人生 > >Zookeeper C API之監視(Watch)、常量和結構體

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相關的常量:

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; //監視移除