如何進行Zookeeper分布式鎖的分析

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

網(wǎng)站設(shè)計制作、做網(wǎng)站介紹好的網(wǎng)站是理念、設(shè)計和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)擁有的網(wǎng)站設(shè)計理念、多方位的設(shè)計風(fēng)格、經(jīng)驗豐富的設(shè)計團隊。提供PC端+手機端網(wǎng)站建設(shè),用營銷思維進行網(wǎng)站設(shè)計、采用先進技術(shù)開源代碼、注重用戶體驗與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。

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

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

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

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

  • 臨時節(jié)點(EPHEMERAL):生命周期和客戶端會話綁定,一旦客戶端會話失效,這個節(jié)點就會自動刪除。

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

如何進行Zookeeper 分布式鎖的分析

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

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

實現(xiàn)原理    

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

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

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

如何進行Zookeeper 分布式鎖的分析

明白原理后,代碼寫起來就非常的簡單了。

如何進行Zookeeper 分布式鎖的分析

如何進行Zookeeper 分布式鎖的分析

如何進行Zookeeper 分布式鎖的分析

如何進行Zookeeper 分布式鎖的分析

如何進行Zookeeper 分布式鎖的分析

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

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

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

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

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

  • 可重入鎖Shared Reentrant Lock

  • 不可重入鎖Shared Lock

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

  • 信號量Shared Semaphore

  • 多鎖對象 Multi Shared Lock

上述就是小編為大家分享的如何進行Zookeeper 分布式鎖的分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前標題:如何進行Zookeeper分布式鎖的分析
文章轉(zhuǎn)載:http://muchs.cn/article40/jojdho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、商城網(wǎng)站、App開發(fā)、品牌網(wǎng)站設(shè)計網(wǎng)站建設(shè)、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)