溫馨提示×

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

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

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

發(fā)布時(shí)間:2022-01-10 17:17:58 來(lái)源:億速云 閱讀:159 作者:柒染 欄目:建站服務(wù)器

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

前言

Zookeeper分布式鎖的代碼實(shí)現(xiàn)

在上一篇博客中,從思路上已經(jīng)分析了Zookeeper如何幫助我們實(shí)現(xiàn)分布式鎖,我們直接來(lái)看代碼:

[分布式客戶(hù)端]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

[獲取分布式鎖的方法lock:初始化ZK]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

[獲取分布式鎖的方法lock:創(chuàng)建臨時(shí)節(jié)點(diǎn)與判斷最小路徑]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

[main測(cè)試]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

[運(yùn)行結(jié)果]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

需要注意的是,即便監(jiān)控到了比自己序號(hào)小的節(jié)點(diǎn)的刪除Watcher,也需要再次確認(rèn)下!

從結(jié)果上,看的很清楚,各個(gè)線程有序獲得鎖。

zkclient

zkclient是在zookeeper原生API基礎(chǔ)上做了一點(diǎn)封裝,簡(jiǎn)化了ZK的復(fù)雜性。

來(lái)看代碼:

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

我們觀察下zkclient的使用,和以前基于zookeeper的原生API有哪些區(qū)別呢?

第一,原生API需要我們利用CountDownLatch來(lái)確保ZK的初始化,現(xiàn)在zkclient幫助我們屏蔽掉了這個(gè)細(xì)節(jié)

第二,原生API是不可以遞歸創(chuàng)建節(jié)點(diǎn)的,而zkclient可以幫助我們遞歸創(chuàng)建不存在的父節(jié)點(diǎn),還可以遞歸刪除

第三,支持序列化操作,上面的代碼你大概可以看出一些端倪,就是我們從操作byte[]到操作String了。(事實(shí)上,在zkclient中你只需要實(shí)現(xiàn)ZkSerializer接口,就可以完成Object到byte[]的轉(zhuǎn)換,雖然如此,但是實(shí)際開(kāi)發(fā)中,利用JSON也挺好的?。?/p>

第四,還有最重要的一點(diǎn)就是,zkclient將對(duì)節(jié)點(diǎn)的操作和對(duì)節(jié)點(diǎn)的監(jiān)控分離開(kāi)了,在原生API中2者是耦合在一起的!從思想上來(lái)看,便于理解;從代碼上來(lái)看,也簡(jiǎn)潔些(如果寫(xiě)在一起,頭都大了);更加方便的是,zkclient替我們完成了重復(fù)watch的功能!

[watch訂閱機(jī)制]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

看到?jīng)]有,是不是有點(diǎn)像MQ的訂閱機(jī)制,非常好用!【但是也有點(diǎn)不太完美,子節(jié)點(diǎn)的數(shù)據(jù)變更為什么沒(méi)有監(jiān)控呢,這有點(diǎn)不符合人性??!還好有Curator...】

但是呢,我們知道ZK是有很多應(yīng)用場(chǎng)景的,比如實(shí)現(xiàn)分布式鎖,zkclient并沒(méi)有替我們進(jìn)行封裝,但是Curator框架可以幫助我們做到!

Curator

為了更好實(shí)現(xiàn)Java操作Zookeeper服務(wù)器,后來(lái)出現(xiàn)Curator框架,功能非常強(qiáng)大,目前已經(jīng)是Apache的頂級(jí)項(xiàng)目,有很多豐富的特性,比如session超時(shí)重連,主從選舉,分布式計(jì)數(shù)器,分布式鎖等,非常有利于Zookeeper復(fù)雜場(chǎng)景下的開(kāi)發(fā)。

POM文件:

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

增刪改查:

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)Curator框架使用鏈?zhǔn)骄幊田L(fēng)格,易讀性很強(qiáng)!

注意,不論是原生的API,還是基于zkclient的API,都是提供的connectTimeout,而Curator提供了sessionTimeout,功能很強(qiáng)大。

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

無(wú)論是原生的API,還是zkclient,都是支持異步回調(diào)的,但是Curator框架在支持異步回調(diào)的同時(shí),增加了線程池供我們優(yōu)化!

[NodeCacheListener]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

[PathChildrenCacheListener]

如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)

對(duì)于Curator而言,為了解決重復(fù)Watch的問(wèn)題,它引入了一種全新的思想:Cache與ZK SERVER比對(duì)的機(jī)制。不論是原生的API,還是基于ZKCLIENT的,其實(shí)它們解決思路都是重復(fù)注冊(cè)!

思路決定出路!Curator通過(guò)事件驅(qū)動(dòng)將客戶(hù)端的Cache與ZK SERVER的數(shù)據(jù)比對(duì),就自然而然的解決了重復(fù)WATCH的功能!為什么Curator能成為Apache的頂級(jí)項(xiàng)目呢,我想大概就是因?yàn)樗呐c眾不同的設(shè)計(jì)思想!

在Curator中,有2種Listener,一個(gè)是監(jiān)控節(jié)點(diǎn)的NodeCacheListener,一個(gè)是監(jiān)控子節(jié)點(diǎn)的PathChildrenCacheListener。PathChildernCacheListener可以監(jiān)控子節(jié)點(diǎn)的新增、修改、刪除,非常好用!

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

向AI問(wèn)一下細(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