順序節(jié)點特性:
使用 ZooKeeper 的順序節(jié)點特性,假如我們在/lock/目錄下創(chuàng)建3個節(jié)點浊闪,ZK集群會按照發(fā)起創(chuàng)建的順序來創(chuàng)建節(jié)點,節(jié)點分別為/lock/0000000001螺戳、/lock/0000000002搁宾、/lock/0000000003,最后一位數(shù)是依次遞增的温峭,節(jié)點名由zk來完成猛铅。
臨時節(jié)點特性:
ZK中還有一種名為臨時節(jié)點的節(jié)點,臨時節(jié)點由某個客戶端創(chuàng)建凤藏,當(dāng)客戶端與ZK集群斷開連接奸忽,則該節(jié)點自動被刪除堕伪。EPHEMERAL_SEQUENTIAL為臨時順序節(jié)點。
根據(jù)ZK中節(jié)點是否存在栗菜,可以作為分布式鎖的鎖狀態(tài)欠雌,以此來實現(xiàn)一個分布式鎖,下面是分布式鎖的基本邏輯:
- 客戶端1調(diào)用create()方法創(chuàng)建名為“/業(yè)務(wù)ID/lock-”的臨時順序節(jié)點疙筹。
- 客戶端1調(diào)用getChildren(“業(yè)務(wù)ID”)方法來獲取所有已經(jīng)創(chuàng)建的子節(jié)點富俄。
- 客戶端獲取到所有子節(jié)點path之后,如果發(fā)現(xiàn)自己在步驟1中創(chuàng)建的節(jié)點是所有節(jié)點中序號最小的而咆,就是看自己創(chuàng)建的序列號是否排第一霍比,如果是第一,那么就認(rèn)為這個客戶端1獲得了鎖暴备,在它前面沒有別的客戶端拿到鎖悠瞬。
- 如果創(chuàng)建的節(jié)點不是所有節(jié)點中需要最小的,那么則監(jiān)視比自己創(chuàng)建節(jié)點的序列號小的最大的節(jié)點涯捻,進(jìn)入等待浅妆。直到下次監(jiān)視的子節(jié)點變更的時候,再進(jìn)行子節(jié)點的獲取障癌,判斷是否獲取鎖凌外。