溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

zookeeper分布式鎖如何實現(xiàn)

發(fā)布時間:2022-02-19 13:16:40 來源:億速云 閱讀:108 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“zookeeper分布式鎖如何實現(xiàn)”,在日常操作中,相信很多人在zookeeper分布式鎖如何實現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”zookeeper分布式鎖如何實現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

架構介紹

在介紹使用Zookeeper實現(xiàn)分布式鎖之前,首先看當前的系統(tǒng)架構圖zookeeper分布式鎖如何實現(xiàn)

解釋:左邊的整個區(qū)域表示一個Zookeeper集群,locker是Zookeeper的一個持久節(jié)點,node_1、node_2、node_3是locker這個持久節(jié)點下面的臨時順序節(jié)點。client_1、client_2、client_n表示多個客戶端,Service表示需要互斥訪問的共享資源。

分布式鎖獲取思路

1.獲取分布式鎖的總體思路a、在獲取分布式鎖的時候在locker節(jié)點下創(chuàng)建臨時順序節(jié)點,釋放鎖的時候刪除該臨時節(jié)點。

b、客戶端調(diào)用createNode方法在locker下創(chuàng)建臨時順序節(jié)點,然后調(diào)用getChildren(“l(fā)ocker”)來獲取locker下面的所有子節(jié)點,注意此時不用設置任何Watcher。

c、客戶端獲取到所有的子節(jié)點path之后,如果發(fā)現(xiàn)自己創(chuàng)建的子節(jié)點序號最小,那么就認為該客戶端獲取到了鎖。

d、如果發(fā)現(xiàn)自己創(chuàng)建的節(jié)點并非locker所有子節(jié)點中最小的,說明自己還沒有獲取到鎖,此時客戶端需要找到比自己小的那個節(jié)點,然后對其調(diào)用exist()方法,同時對其注冊事件監(jiān)聽器。

e、之后,讓這個被關注的節(jié)點刪除,則客戶端的Watcher會收到相應通知,此時再次判斷自己創(chuàng)建的節(jié)點是否是locker子節(jié)點中序號最小的,如果是則獲取到了鎖,如果不是則重復以上步驟繼續(xù)獲取到比自己小的一個節(jié)點并注冊監(jiān)聽。

2.獲取分布式鎖的核心算法流程下面同個一個流程圖來分析獲取分布式鎖的完整算法,如下:zookeeper分布式鎖如何實現(xiàn)

解釋:客戶端A要獲取分布式鎖的時候首先到locker下創(chuàng)建一個臨時順序節(jié)點(node_n),然后立即獲取locker下的所有(一級)子節(jié)點。

此時因為會有多個客戶端同一時間爭取鎖,因此locker下的子節(jié)點數(shù)量就會大于1。對于順序節(jié)點,特點是節(jié)點名稱后面自動有一個數(shù)字編號,先創(chuàng)建的節(jié)點數(shù)字編號小于后創(chuàng)建的,因此可以將子節(jié)點按照節(jié)點名稱后綴的數(shù)字順序從小到大排序,這樣排在第一位的就是最先創(chuàng)建的順序節(jié)點,此時它就代表了最先爭取到鎖的客戶端!

此時判斷最小的這個節(jié)點是否為客戶端A之前創(chuàng)建出來的node_n,如果是則表示客戶端A獲取到了鎖,如果不是則表示鎖已經(jīng)被其它客戶端獲取,因此客戶端A要等待它釋放鎖,也就是等待獲取到鎖的那個客戶端B把自己創(chuàng)建的那個節(jié)點刪除。此時就通過監(jiān)聽比node_n次小的那個順序節(jié)點的刪除事件來知道客戶端B是否已經(jīng)釋放了鎖,如果是,此時客戶端A再次獲取locker下的所有子節(jié)點,再次與自己創(chuàng)建的node_n節(jié)點對比,直到自己創(chuàng)建的node_n是locker的所有子節(jié)點中順序號最小的,此時表示客戶端A獲取到了鎖!

到此,關于“zookeeper分布式鎖如何實現(xiàn)”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI