溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Zookeeper 分布式鎖的分析

發(fā)布時(shí)間:2021-12-24 09:17:53 來源:億速云 閱讀:147 作者:柒染 欄目:云計(jì)算

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何進(jìn)行Zookeeper 分布式鎖的分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

我們借助 Zookeeper 實(shí)現(xiàn)一個(gè)不可重入的分布式鎖!

分布式鎖對(duì) Java 的 JUC 包來說就顯得無能為力了。所以我們要借助 Zookeeper 的最小版本,Redis 的 set 函數(shù),數(shù)據(jù)庫鎖來實(shí)現(xiàn)分布式鎖。

我們知道在 Zookeeper 中是使用文件目錄的格式存放節(jié)點(diǎn)內(nèi)容,其中節(jié)點(diǎn)類型分為:

  • 持久節(jié)點(diǎn)(PERSISTENT ):節(jié)點(diǎn)創(chuàng)建后,一直存在,直到主動(dòng)刪除了該節(jié)點(diǎn)。


  • 臨時(shí)節(jié)點(diǎn)(EPHEMERAL):生命周期和客戶端會(huì)話綁定,一旦客戶端會(huì)話失效,這個(gè)節(jié)點(diǎn)就會(huì)自動(dòng)刪除。


  • 序列節(jié)點(diǎn)(SEQUENTIAL ):多個(gè)線程創(chuàng)建同一個(gè)順序節(jié)點(diǎn)時(shí)候,每個(gè)線程會(huì)得到一個(gè)帶有編號(hào)的節(jié)點(diǎn),節(jié)點(diǎn)編號(hào)是遞增不重復(fù)的,如下圖:

如何進(jìn)行Zookeeper 分布式鎖的分析

如上圖,三個(gè)線程分別創(chuàng)建路徑為 /root/node 的節(jié)點(diǎn),可知在 zk 服務(wù)器端會(huì)在 root 下存在三個(gè) node 節(jié)點(diǎn),并且線程編號(hào)是唯一遞增。

具體在節(jié)點(diǎn)創(chuàng)建過程中,可以混合使用,比如臨時(shí)順序節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL),本文我們就使用臨時(shí)順序節(jié)點(diǎn)來實(shí)現(xiàn)分布式鎖。

實(shí)現(xiàn)原理    

創(chuàng)建臨時(shí)順序節(jié)點(diǎn),比如 /root/node,假設(shè)返回結(jié)果為 nodeId。

獲取 /root 下所有孩子節(jié)點(diǎn),用自己創(chuàng)建的 nodeId 的序號(hào)與所有子節(jié)點(diǎn)比較,看看自己是不是編號(hào)最小的。如果是最小的則就相當(dāng)于獲取到了鎖,如果自己不是最小的,則從所有子節(jié)點(diǎn)里面獲取比自己次小的一個(gè)節(jié)點(diǎn),然后設(shè)置監(jiān)聽該節(jié)點(diǎn)的事件,然后掛起當(dāng)前線程。

當(dāng)最小編號(hào)的線程獲取鎖,處理完業(yè)務(wù)后刪除自己對(duì)應(yīng)的 nodeId,刪除后會(huì)激活比自己大一號(hào)的節(jié)點(diǎn)的線程從阻塞變?yōu)檫\(yùn)行態(tài),被激活的線程應(yīng)該就是當(dāng)前 node 序列號(hào)最小的了,然后就會(huì)獲取到鎖。

如何進(jìn)行Zookeeper 分布式鎖的分析

明白原理后,代碼寫起來就非常的簡(jiǎn)單了。

如何進(jìn)行Zookeeper 分布式鎖的分析

如何進(jìn)行Zookeeper 分布式鎖的分析

如何進(jìn)行Zookeeper 分布式鎖的分析

如何進(jìn)行Zookeeper 分布式鎖的分析

如何進(jìn)行Zookeeper 分布式鎖的分析

ZookeeperDistributedLock 的構(gòu)造函數(shù)創(chuàng)建 zkclient,并且注冊(cè)了監(jiān)聽事件,然后調(diào)用 connectedSignal.await() 掛起當(dāng)前線程。當(dāng) zkclient 鏈接到服務(wù)器后,會(huì)給監(jiān)聽器發(fā)送 SyncConnected 事件,監(jiān)聽器判斷當(dāng)前鏈接已經(jīng)建立了,則調(diào)用 connectedSignal.countDown(); 激活當(dāng)前線程,然后創(chuàng)建 root 節(jié)點(diǎn)。

獲取鎖的方法 lock,內(nèi)部首先創(chuàng)建 /root/lockName 的順序臨時(shí)節(jié)點(diǎn),然后獲取 /root 下所有的孩子節(jié)點(diǎn),并對(duì)子節(jié)點(diǎn)進(jìn)行排序,然后判斷自己是不是最小的編號(hào),如果是直接返回 true 標(biāo)示獲取鎖成功。否者看比自己小一個(gè)號(hào)的節(jié)點(diǎn)是否存在,存在則注冊(cè)該節(jié)點(diǎn)的事件,然后掛起當(dāng)前線程,等待比自己小一個(gè)數(shù)的節(jié)點(diǎn)釋放鎖后發(fā)送節(jié)點(diǎn)刪除事件,事件里面激活當(dāng)前線程。

釋放鎖的方法 unlock 比較簡(jiǎn)單,就是簡(jiǎn)單的刪除獲取鎖時(shí)候創(chuàng)建的節(jié)點(diǎn)。

Zookeeper 非常的強(qiáng)大,當(dāng)你真正的了解后,你會(huì)發(fā)現(xiàn)它能做很多事情。

光分布鎖方面,它都能幫助我們實(shí)現(xiàn)好幾種,如下面我列舉的這些:

  • 可重入鎖Shared Reentrant Lock


  • 不可重入鎖Shared Lock


  • 可重入讀寫鎖Shared Reentrant Read Write Lock


  • 信號(hào)量Shared Semaphore


  • 多鎖對(duì)象 Multi Shared Lock

上述就是小編為大家分享的如何進(jìn)行Zookeeper 分布式鎖的分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI