3)用zookeeper實現分布式鎖

2021-09-01 22:40:53 字數 1557 閱讀 2043

在我們的專案當中,可能有許多元件在並行的執行。這些元件可能需要更新我們的資料儲存。所以這些元件應該有解決衝突的能力,避免髒資料。但是這些元件往往執行在不同的伺服器上,甚至程式語言,檔案系統結構都是不同的。這些差異給我們的分布式協作帶來困難。

zookeeper給我們提供了解決方案。那麼如何借助zookeeper來管理我們的分布式系統,達到系統之間的協作呢?我們可以通過zookeeper來實現分布式鎖的概念,從而達到系統之間的協作目的。

public class distributedlock 

public void lock() throws ioexception

}});

collections.sort(nodes); // zookeeper node names can be sorted lexographically

if (lockpath.endswith(nodes.get(0)) else }}

} catch (keeperexception e) catch (interruptedexception e)

} public void unlock() throws ioexception catch (keeperexception e) catch (interruptedexception e)

}}

構造方法

public distributedlock(zookeeper zk, string lockbasepath, string lockname)
需要給構造方法提供三個引數,zk 表示可以連線到zookeeper伺服器的客戶端。lockbasepath 準備將節點建立在那個目錄路徑下。lockname指建立的子目錄名稱。

建立節點

lockpath = zk.create(lockbasepath + "/" + lockname, null, ids.open_acl_unsafe, createmode.ephemeral_sequential);
這裡注意的地方就是節點的型別是ephemeral並且是sequetial的。也就是說我們可以在lockbasepath下面可以建立多個名為lockname的多個臨時節點,這些節點時有序的。sequetial節點的名稱可以相同,因為zookeeper將transactionid字尾到節點路徑後面以用於區分。這也是實現分布式鎖的關鍵。另外這些節點時臨時的,保證當申請鎖的程式失去session以後,可以由zookeeper自動去除該節點。

申請鎖

final object lock = new object();

synchronized(lock)

}});

collections.sort(nodes); // zookeeper node names can be sorted lexographically

if (lockpath.endswith(nodes.get(0)) else

}}

因為watcher 裡面的process()是有外部執行緒觸發的,所以為了保證兩次時間上相近的觸發操作能夠同步執行使用兩層的synchronized block。

zookeeper分布式操作的實現(3)

分布式鎖主要用於在分布式環境中保護跨程序 跨主機 跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。在介紹使用zookeeper實現分布式鎖之前,首先看當前的系統架構圖 解釋 左邊的整個區域表示乙個zookeeper集群,locker是zookeeper的乙個持久節點,node 1 node 2...

Dubbo基於Zookeeper實現分布式服務

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

Zookeeper實現分布式鎖

zookeeper實現分布式鎖 實現分布式環境下同步鎖的實現 author hao.wang date 2017 1 20 15 43 public class distributelockdemo implements watcher catch ioexception e catch inter...