新聞中心
在我們進(jìn)行單機(jī)應(yīng)用開發(fā),涉及并發(fā)同步的時(shí)候,我們往往采用synchronized或者Lock的方式來(lái)解決多線程間的代碼同步問(wèn)題。但當(dāng)我們的應(yīng)用是分布式集群工作的情況下,那么就需要一種更加高級(jí)的鎖機(jī)制,來(lái)處理種跨機(jī)器的進(jìn)程之間的數(shù)據(jù)同步問(wèn)題。這就是分布式鎖,下面重點(diǎn)為大家講解一下zookeeper分布式鎖。

十載的措勤網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整措勤建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“措勤網(wǎng)站設(shè)計(jì)”,“措勤網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
架構(gòu)介紹
在介紹使用Zookeeper實(shí)現(xiàn)分布式鎖之前,首先看當(dāng)前的系統(tǒng)架構(gòu)圖
解釋:左邊的整個(gè)區(qū)域表示一個(gè)Zookeeper集群,locker是Zookeeper的一個(gè)持久節(jié)點(diǎn),node_1、node_2、node_3是locker這個(gè)持久節(jié)點(diǎn)下面的臨時(shí)順序節(jié)點(diǎn)。client_1、client_2、client_n表示多個(gè)客戶端,Service表示需要互斥訪問(wèn)的共享資源。
分布式鎖獲取思路
1.獲取分布式鎖的總體思路a、在獲取分布式鎖的時(shí)候在locker節(jié)點(diǎn)下創(chuàng)建臨時(shí)順序節(jié)點(diǎn),釋放鎖的時(shí)候刪除該臨時(shí)節(jié)點(diǎn)。
b、客戶端調(diào)用createNode方法在locker下創(chuàng)建臨時(shí)順序節(jié)點(diǎn),然后調(diào)用getChildren(“l(fā)ocker”)來(lái)獲取locker下面的所有子節(jié)點(diǎn),注意此時(shí)不用設(shè)置任何Watcher。
c、客戶端獲取到所有的子節(jié)點(diǎn)path之后,如果發(fā)現(xiàn)自己創(chuàng)建的子節(jié)點(diǎn)序號(hào)最小,那么就認(rèn)為該客戶端獲取到了鎖。
d、如果發(fā)現(xiàn)自己創(chuàng)建的節(jié)點(diǎn)并非locker所有子節(jié)點(diǎn)中最小的,說(shuō)明自己還沒有獲取到鎖,此時(shí)客戶端需要找到比自己小的那個(gè)節(jié)點(diǎn),然后對(duì)其調(diào)用exist()方法,同時(shí)對(duì)其注冊(cè)事件監(jiān)聽器。
e、之后,讓這個(gè)被關(guān)注的節(jié)點(diǎn)刪除,則客戶端的Watcher會(huì)收到相應(yīng)通知,此時(shí)再次判斷自己創(chuàng)建的節(jié)點(diǎn)是否是locker子節(jié)點(diǎn)中序號(hào)最小的,如果是則獲取到了鎖,如果不是則重復(fù)以上步驟繼續(xù)獲取到比自己小的一個(gè)節(jié)點(diǎn)并注冊(cè)監(jiān)聽。
2.獲取分布式鎖的核心算法流程下面同個(gè)一個(gè)流程圖來(lái)分析獲取分布式鎖的完整算法,如下:解釋:客戶端A要獲取分布式鎖的時(shí)候首先到locker下創(chuàng)建一個(gè)臨時(shí)順序節(jié)點(diǎn)(node_n),然后立即獲取locker下的所有(一級(jí))子節(jié)點(diǎn)。
此時(shí)因?yàn)闀?huì)有多個(gè)客戶端同一時(shí)間爭(zhēng)取鎖,因此locker下的子節(jié)點(diǎn)數(shù)量就會(huì)大于1。對(duì)于順序節(jié)點(diǎn),特點(diǎn)是節(jié)點(diǎn)名稱后面自動(dòng)有一個(gè)數(shù)字編號(hào),先創(chuàng)建的節(jié)點(diǎn)數(shù)字編號(hào)小于后創(chuàng)建的,因此可以將子節(jié)點(diǎn)按照節(jié)點(diǎn)名稱后綴的數(shù)字順序從小到大排序,這樣排在第一位的就是最先創(chuàng)建的順序節(jié)點(diǎn),此時(shí)它就代表了最先爭(zhēng)取到鎖的客戶端!
此時(shí)判斷最小的這個(gè)節(jié)點(diǎn)是否為客戶端A之前創(chuàng)建出來(lái)的node_n,如果是則表示客戶端A獲取到了鎖,如果不是則表示鎖已經(jīng)被其它客戶端獲取,因此客戶端A要等待它釋放鎖,也就是等待獲取到鎖的那個(gè)客戶端B把自己創(chuàng)建的那個(gè)節(jié)點(diǎn)刪除。此時(shí)就通過(guò)監(jiān)聽比node_n次小的那個(gè)順序節(jié)點(diǎn)的刪除事件來(lái)知道客戶端B是否已經(jīng)釋放了鎖,如果是,此時(shí)客戶端A再次獲取locker下的所有子節(jié)點(diǎn),再次與自己創(chuàng)建的node_n節(jié)點(diǎn)對(duì)比,直到自己創(chuàng)建的node_n是locker的所有子節(jié)點(diǎn)中順序號(hào)最小的,此時(shí)表示客戶端A獲取到了鎖!
當(dāng)前名稱:詳解zookeeper分布式鎖
分享鏈接:http://fisionsoft.com.cn/article/dhgjchd.html


咨詢
建站咨詢
