Zookeeper實現分佈式鎖詳細步驟,你一定要知道

前幾天分享了分佈式鎖的三種實現方案(我們是這樣一步一步實現分佈式鎖的),其中對於zookeeper實現方式,有些朋友說想知道實現的總體流程。那麼今天我就來將zookeeper的具體實現流程通過一步一圖的形式再來說一下,然後大家可以根據前面的代碼進行一起理解下,這樣應該會更容易搞懂zookeeper的分佈式鎖。

 

zookeeper節點特徵

現在我們都知道zookeeper是基於樹形數據結構實現分佈式鎖,以用來解決我們分佈式環境下對於共享資源的數據一致性問題。其中,zookeeper樹形結構有四種節點:

  • 持久節點,這是zookeeper的默認節點類型,一直存在。

  • 持久順序節點,創建的節點,zookeeper會依據時間的順序對創建的節點進行排序。

  • 臨時節點,就是在zookeeper中臨時創建的節點,zookeeper客戶端與服務端斷開或者是故障,就會刪除臨時節點

  • 臨時順序節點,和持久順序節點類似,只不過就是臨時的。

     

zookeeper實現分佈式鎖流程

通過上面zookeeper節點的特性,我們可以看出,使用臨時順序節點是可以實現我們的分佈式鎖的。

1,首先假如第一個客戶端來獲取共享資源也就是獲取鎖時,zookeeper客戶端會創建持久根節點/locks

 

2,這個時候,客戶端Client1就會查詢/locks節點下面所有子節點,然後判斷自己的節點是不是排序最小的那個,此時,如果是最小的則會獲得鎖,就能夠對共享資源進行操作。

 

3,如果,這個時候又來個個客戶端Client2也來嘗試獲取鎖,那麼它也會在zookeeper的/locks節點下創建一個節點。

 

4,Client2同樣也會查詢zookeeper中/locks節點下所有節點,判斷自己編號是不是最小的,此時,發現自己並不是最小的,所以獲取鎖失敗,然後就像它的前面一位節點0001註冊Watcher事件來監控0001節點是否存在。

 

5,此時,又來一個客戶端Client3來嘗試獲取鎖,就會在/locks下創建自己的節點

 

6,同樣,客戶端Client3查詢/locks下所有節點,判斷自己是不是編號最小的節點,此時,發現自己並不是最小的,就會獲取所失敗,接着就會像它前面一位0002的節點註冊Watcher事件,來監聽0002節點是否存在。

 

所以,我們現在能發現獲得鎖的是客戶端Client1,客戶端Client2則監聽着Client1的鎖啥時候釋放,而Client3就監聽着Client2的鎖釋放。

 

zookeeper釋放鎖流程

客戶端獲得鎖之後,現在我們再來看看是怎麼釋放鎖的:

1,當客戶端Client1業務完成之後,或者客戶端故障,就會刪除節點0001,主動釋放鎖。

 

2,0001節點被刪除,此時Client2就會立馬監聽到鎖被釋放,就會去獲取鎖。

 

3,客戶端Client2獲得鎖後,完成了業務操作,就會刪掉0002編號節點

 

4,最後Client3監聽到0002被刪除了,則自己就會去獲取鎖和釋放鎖。

 

 

總結,今天我們把zookeeper實現分佈式鎖的整體流程通過一步一圖的形式詳細的講解了一遍,知道了分佈式環境下,鎖是什麼時候獲取以及什麼時候釋放的,這些通過zookeeper的臨時順序節點特性都幫我們進行自動管理好了,不需要我們去自己管理,所以實現起來還是很方便,大家可以去結合前面文章代碼再看看(我們是這樣一步一步實現分佈式鎖的),如果大家喜歡或者對大家有幫助就關注我,我會一直分享業界流行技術解決方案,共同學習共同進步。

在公衆號點擊菜單“成神之路”,免費獲取最新專屬一線大咖視頻資料,包括今年面試。可獲得專屬架構視頻資料,更多java、python、人工智能、小程序、大前端等可加作者,無私奉獻

 

往期精選

數據庫分庫分表後,我們怎麼保證ID全局唯一

數據庫分庫分表方案,優化大量併發寫入所帶來的性能問題

數據庫讀寫分離方案,實現高性能數據庫集羣

java類加載機制,再也不怕面試官的刁難

 

 

關於   “架構師修煉”

本號旨在分享一線互聯網各種技術架構解決方案,分佈式以及高併發等相關專題,同時會將作者的學習總結進行整理並分享。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章