基於ZooKeeper實現分布式鎖

2021-09-23 01:11:52 字數 645 閱讀 6701

zookeeper 保證了資料的強一致性,  zk集群中任意節點(乙個zkserver)上的相同znode下的資料一定是相同的。使用zookeeper可以非常簡單的實現分布式鎖,

其基本邏輯如下:

客戶端呼叫create()方法建立名為「locknode/lock」的節點,需要注意的是,這裡節點的建立型別需要設定為ephemeral_sequential。

客戶端呼叫getchildren(「lock」)方法來獲取所有已經建立的lock節點的子節點,同時在這個節點上註冊上子節點變更通知的watcher。

客戶端獲取到所有子節點path之後,如果發現自己在步驟1中建立的節點是所有節點中序號最小的,那麼就認為這個客戶端獲得了鎖。

如果在步驟3中發現自己並非是所有子節點中最小的,說明自己還沒有獲取到鎖,就等待,直到下次子節點變更通知的時候,再進行子節點的獲取,判斷是否獲取鎖。

釋放鎖的過程比較簡單,就是刪除自己建立的那個子節點即可。

附:分布式鎖實現過程中考慮問題的思路:

1.鎖何時獨佔

2.鎖何時釋放

3.鎖占有或者釋放的先後次序可能引起的問題(控制時序)

參考:zookeeper典型使用場景一覽

分布式

Dubbo基於Zookeeper實現分布式服務

點關注不迷路,歡迎再訪!精簡部落格內容,盡量已行業術語來分享。努力做到對每一位認可自己的讀者負責。幫助別人的同時更是豐富自己的良機。既然是新手教學,肯定很多同學不明白什麼是分布式和遠端服務呼叫,為什麼要分布式,為什麼要遠端呼叫。下圖為例 以前什麼的都在乙個伺服器上,呼叫方法直接就自然而然呼叫了,沒啥...

基於zookeeper實現分布式鎖

zk有兩種資料節點,一種時持久節點 另一種時瞬時節點,有序,瞬時節點不可再有子節點,會話結束後瞬時節點自動消失 zookeeper的觀察器 可以設定觀察器的三個方法 getdata getchildren exist 資料節點發生變化,傳送給客戶端 觀察器只能監控一次,再監控需要重新設定 zk分布式...

基於ZooKeeper的分布式鎖實現(C 版本)

一 簡介 分布式同步是zookeeper的功能之一,但zookeeper的分布式同步 分布式鎖 功能並非以直接的介面呈現的。開發者需要額外地基於zookeeper的節點 node 的分布式同步特性來實現分布式鎖的介面。本文將提供基於基於zookeeper的分布式鎖的c 介面及實現,實現中用到了部分c...