ZooKeeper 節點類型

ZooKeeper 節點是有生命週期的,這取決於節點的類型。在 ZooKeeper 中,節點類型可以分爲持久節點(PERSISTENT )、臨時節點(EPHEMERAL),以及時序節點(SEQUENTIAL ),具體在節點創建過程中,一般是組合使用,可以生成以下 4 種節點類型。

持久節點(PERSISTENT)

所謂持久節點,是指在節點創建後,就一直存在,直到有刪除操作來主動清除這個節點——不會因爲創建該節點的客戶端會話失效而消失。

持久順序節點(PERSISTENT_SEQUENTIAL)

這類節點的基本特性和上面的節點類型是一致的。額外的特性是,在ZK中,每個父節點會爲他的第一級子節點維護一份時序,會記錄每個子節點創建的先後順序。基於這個特性,在創建子節點的時候,可以設置這個屬性,那麼在創建節點過程中,ZK會自動爲給定節點名加上一個數字後綴,作爲新的節點名。這個數字後綴的範圍是整型的最大值。

臨時節點(EPHEMERAL)

和持久節點不同的是,臨時節點的生命週期和客戶端會話綁定。也就是說,如果客戶端會話失效,那麼這個節點就會自動被清除掉。注意,這裏提到的是會話失效,而非連接斷開。另外,在臨時節點下面不能創建子節點。

臨時順序節點(EPHEMERAL_SEQUENTIAL)

可以用來實現分佈式鎖

客戶端調用create()方法創建名爲“locknode/guid-lock-”的節點,需要注意的是,這裏節點的創建類型需要設置爲EPHEMERAL_SEQUENTIAL。
客戶端調用getChildren(“locknode”)方法來獲取所有已經創建的子節點,注意,這裏不註冊任何Watcher。
客戶端獲取到所有子節點path之後,如果發現自己在步驟1中創建的節點序號最小,那麼就認爲這個客戶端獲得了鎖。
如果在步驟3中發現自己並非所有子節點中最小的,說明自己還沒有獲取到鎖。此時客戶端需要找到比自己小的那個節點,然後對其調用exist()方法,同時註冊事件監聽。
之後當這個被關注的節點被移除了,客戶端會收到相應的通知。這個時候客戶端需要再次調用getChildren(“locknode”)方法來獲取所有已經創建的子節點,確保自己確實是最小的節點了,然後進入步驟3。

轉自:http://nileader.blog.51cto.com/1381108/946788

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章