成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖文并茂:Zookeeper分布式鎖原理

開發 架構
這篇文章再給大家聊一下ZooKeeper實現分布式鎖的原理。

寫在前面

之前寫過一篇文章(《?Redis 分布式鎖,沒它真不行!?》),給大家說了一下Redisson這個開源框架是如何實現Redis分布式鎖原理的,這篇文章再給大家聊一下ZooKeeper實現分布式鎖的原理。

同理,我是直接基于比較常用的Curator這個開源框架,聊一下這個框架對ZooKeeper(以下簡稱zk)分布式鎖的實現。

一般除了大公司是自行封裝分布式鎖框架之外,建議大家用這些開源框架封裝好的分布式鎖實現,這是一個比較快捷省事兒的方式。

ZooKeeper分布式鎖機制

接下來我們一起來看看,多客戶端獲取及釋放zk分布式鎖的整個流程及背后的原理。

首先大家看看下面的圖,如果現在有兩個客戶端一起要爭搶zk上的一把分布式鎖,會是個什么場景?

圖文并茂:Zookeeper分布式鎖原理

如果大家對zk還不太了解,建議先百度一下,快速了解一些基本概念,比如zk有哪些節點類型等等。

參見上圖。zk里有一把鎖,這個鎖就是zk上的一個節點。然后呢,兩個客戶端都要來獲取這個鎖,具體是怎么來獲取呢?

咱們就假設客戶端A搶先一步,對zk發起了加分布式鎖的請求,這個加鎖請求是用到了zk中的一個特殊的概念,叫做“臨時順序節點”。

簡單來說,就是直接在"my_lock"這個鎖節點下,創建一個順序節點,這個順序節點有zk內部自行維護的一個節點序號。

比如說,第一個客戶端來搞一個順序節點,zk內部會給起個名字叫做:xxx-000001。然后第二個客戶端來搞一個順序節點,zk可能會起個名字叫做:xxx-000002。大家注意一下,最后一個數字都是依次遞增的,從1開始逐次遞增。zk會維護這個順序。

所以這個時候,假如說客戶端A先發起請求,就會搞出來一個順序節點,大家看下面的圖,Curator框架大概會弄成如下的樣子:

圖文并茂:Zookeeper分布式鎖原理

大家看,客戶端A發起一個加鎖請求,先會在你要加鎖的node下搞一個臨時順序節點,這一大坨長長的名字都是Curator框架自己生成出來的。

然后,那個最后一個數字是"1"。大家注意一下,因為客戶端A是第一個發起請求的,所以給他搞出來的順序節點的序號是"1"。

接著客戶端A創建完一個順序節點。還沒完,他會查一下"my_lock"這個鎖節點下的所有子節點,并且這些子節點是按照序號排序的,這個時候他大概會拿到這么一個集合:

圖文并茂:Zookeeper分布式鎖原理

接著客戶端A會走一個關鍵性的判斷,就是說:唉!兄弟,這個集合里,我創建的那個順序節點,是不是排在第一個啊?

如果是的話,那我就可以加鎖了??!因為明明我就是第一個來創建順序節點的人,所以我就是第一個嘗試加分布式鎖的人啊!

bingo!加鎖成功!大家看下面的圖,再來直觀的感受一下整個過程。

圖文并茂:Zookeeper分布式鎖原理

接著假如說,客戶端A都加完鎖了,客戶端B過來想要加鎖了,這個時候他會干一樣的事兒:先是在"my_lock"這個鎖節點下創建一個臨時順序節點,此時名字會變成類似于:

圖文并茂:Zookeeper分布式鎖原理

大家看看下面的圖:

圖文并茂:Zookeeper分布式鎖原理

客戶端B因為是第二個來創建順序節點的,所以zk內部會維護序號為"2"。

接著客戶端B會走加鎖判斷邏輯,查詢"my_lock"鎖節點下的所有子節點,按序號順序排列,此時他看到的類似于:

圖文并茂:Zookeeper分布式鎖原理

同時檢查自己創建的順序節點,是不是集合中的第一個?

明顯不是啊,此時第一個是客戶端A創建的那個順序節點,序號為"01"的那個。所以加鎖失??!

加鎖失敗以后,客戶端B就會通過ZK的API,對他的**上一個順序節點加一個監聽器。**zk天然就可以實現對某個節點的監聽。

我們舉例說明,客戶端B的順序節點是:

圖文并茂:Zookeeper分布式鎖原理

他的上一個順序節點,不就是下面這個嗎?

圖文并茂:Zookeeper分布式鎖原理

也就是客戶端A創建的那個順序節點!

所以,客戶端B會對:

圖文并茂:Zookeeper分布式鎖原理

這個節點加一個監聽器,監聽這個節點是否被刪除等變化!

說了那么多,老規矩,給大家來一張圖,直觀的感受一下:

圖文并茂:Zookeeper分布式鎖原理

接著,客戶端A加鎖之后,可能處理了一些代碼邏輯,然后就會釋放鎖。那么,釋放鎖是個什么過程呢?

其實很簡單,就是把自己在zk里創建的那個順序節點,也就是:

圖文并茂:Zookeeper分布式鎖原理

這個節點給刪除。

刪除了那個節點之后,zk會負責通知監聽這個節點的監聽器,也就是客戶端B之前加的那個監聽器,說:兄弟,你監聽的那個節點被刪除了,有人釋放了鎖。

我們一起來看看下面的圖,體會一下這個過程:

圖文并茂:Zookeeper分布式鎖原理

此時客戶端B的監聽器感知到了上一個順序節點被刪除,也就是排在他之前的某個客戶端釋放了鎖。

此時,就會通知客戶端B重新嘗試去獲取鎖,也就是獲取"my_lock"節點下的子節點集合,此時為:

圖文并茂:Zookeeper分布式鎖原理

集合里此時只有客戶端B創建的唯一的一個順序節點了!

然后呢,客戶端B一判斷,發現自己居然是集合中的第一個順序節點,bingo!可以加鎖了!直接完成加鎖,運行后續的業務代碼即可,運行完了之后再次釋放鎖。

最后,再給大家來一張圖,大伙兒順著圖仔細的捋一捋這整個過程:

圖文并茂:Zookeeper分布式鎖原理

總結

其實如果有客戶端C、客戶端D等N個客戶端爭搶一個zk分布式鎖,原理都是類似的。

  • 大家都是上來直接創建一個鎖節點下的一個接一個的臨時順序節點。
  • 如果自己不是第一個節點,就對自己上一個節點加監聽器。
  • 只要上一個節點釋放鎖,自己就排到前面去了,相當于是一個排隊機制。

而且用臨時順序節點的另外一個用意就是,如果某個客戶端創建臨時順序節點之后,不小心自己宕機了也沒關系,zk感知到那個客戶端宕機,會自動刪除對應的臨時順序節點,相當于自動釋放鎖,或者是自動取消自己的排隊。

最后,咱們來看下用Curator框架進行加鎖和釋放鎖的一個過程:

圖文并茂:Zookeeper分布式鎖原理

其實用開源框架就是這點好,方便。這個Curator框架的zk分布式鎖的加鎖和釋放鎖的實現原理,其實就是上面我們說的那樣子。

但是如果你要手動實現一套那個代碼的話。還是有點麻煩的,要考慮到各種細節,異常處理等等。所以大家如果考慮用zk分布式鎖,可以參考下本文的思路。

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-02-28 07:49:28

Zookeeper分布式

2024-11-06 12:29:02

2011-11-21 15:12:54

Java斷點Eclipse

2011-01-18 18:08:28

Thunderbird

2011-01-18 18:29:28

Thunderbird

2017-10-24 11:28:23

Zookeeper分布式鎖架構

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2019-05-05 10:15:42

悲觀鎖樂觀鎖數據安全

2021-07-16 07:57:34

ZooKeeperCurator源碼

2023-05-16 08:01:13

架構網站演進

2012-07-23 14:39:27

移動

2011-01-19 17:30:21

Postfix郵件投遞

2011-01-19 17:34:39

Postfix如何接收郵件

2011-01-20 09:13:18

Postfix

2021-12-27 08:04:49

架構網站高并發

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2020-09-04 09:20:59

Java開發代碼

2024-11-28 15:11:28

2011-01-21 10:28:06

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲网站观看 | 欧美亚洲国产成人 | 丝袜天堂 | 91精品国产91久久综合桃花 | 天天精品在线 | 久久精品亚洲精品国产欧美 | 精品国产乱码久久久久久丨区2区 | 久久国产精品99久久久大便 | 久久久久无码国产精品一区 | 久久99精品久久久久久噜噜 | www国产成人免费观看视频,深夜成人网 | 亚洲精品视频一区 | 在线看无码的免费网站 | 精品一区国产 | 亚洲欧美日本国产 | 国产亚洲成av人片在线观看桃 | 国产高清视频在线 | 亚洲国产自产 | 亚洲视频在线观看 | 久久综合一区 | 亚洲精品免费视频 | 一二三在线视频 | 先锋资源吧| 久久精品91久久久久久再现 | 日韩免费视频一区二区 | 日韩手机视频 | 精品久久久久久久久久久久久久久久久 | 亚洲成人一区二区三区 | 成人免费在线视频 | 91精品国产91久久久久久丝袜 | 美女国内精品自产拍在线播放 | 亚洲免费一区二区 | 99精品国产一区二区三区 | 国产美女高潮 | 欧美精品一区二区三区在线 | 日本一区二区三区四区 | 看毛片网站 | 成人午夜av | 国产高清视频在线观看 | 永久免费在线观看 | 亚州精品天堂中文字幕 |