基於Consul的分布式鎖實現

2021-09-22 05:00:40 字數 2072 閱讀 2583

我們在構建分布式系統的時候,經常需要控制對共享資源的互斥訪問。這個時候我們就涉及到分布式鎖(也稱為全域性鎖)的實現,基於目前的各種工具,我們已經有了大量的實現方式,比如:基於redis的實現、基於zookeeper的實現。本文將介紹一種基於consul 的key/value儲存來實現分布式鎖以及訊號量的方法。

基於consul的分布式鎖主要利用key/value儲存api中的acquire和release操作來實現。acquire和release操作是類似check-and-set的操作:

具體實現中主要使用了這幾個key/value的api:

基本流程

具體實現

public class lock 

/*** 獲取同步鎖

** @param block 是否阻塞,直到獲取到鎖為止

* @return

*/public boolean lock(boolean block)

sessionid = createsession(sessionname);

while(true) else if(block) else }}

/*** 釋放同步鎖

** @return

*/public boolean unlock()

/*** 建立session

* @param sessionname

* @return

*/private string createsession(string sessionname)

}

單元測試

下面單元測試的邏輯:通過執行緒的方式來模擬不同的分布式服務來競爭鎖。多個處理執行緒同時以阻塞方式來申請分布式鎖,當處理執行緒獲得鎖之後,sleep一段隨機事件,以模擬處理業務邏輯,處理完畢之後釋放鎖。

public class testlock 

class lockrunner implements runnable

@override

public void run()

} catch (exception e) finally }}

}

單元測試執行結果如下:

2017-04-12 21:28:09,698 info  [thread-0] lockrunner - thread 1 start!

2017-04-12 21:28:12,717 info [thread-0] lockrunner - thread 1 end!

2017-04-12 21:28:13,219 info [thread-2] lockrunner - thread 3 start!

2017-04-12 21:28:15,672 info [thread-2] lockrunner - thread 3 end!

2017-04-12 21:28:15,735 info [thread-1] lockrunner - thread 2 start!

2017-04-12 21:28:17,788 info [thread-1] lockrunner - thread 2 end!

2017-04-12 21:28:18,249 info [thread-4] lockrunner - thread 5 start!

2017-04-12 21:28:19,573 info [thread-4] lockrunner - thread 5 end!

2017-04-12 21:28:19,757 info [thread-3] lockrunner - thread 4 start!

2017-04-12 21:28:21,353 info [thread-3] lockrunner - thread 4 end!

從測試結果我們可以看到,通過分布式鎖的形式來控制併發時,多個同步操作只會有乙個操作能夠被執行,其他操作只有在等鎖釋放之後才有機會去執行,所以通過這樣的分布式鎖,我們可以控制共享資源同時只能被乙個操作進行執行,以保障資料處理時的分布式併發問題。

優化建議

參考文件

key/value的api:

選舉機制:

實現**

基於Redis實現分布式鎖

分布式鎖的基本功能 1.同一時刻只能存在乙個鎖 2.需要解決意外死鎖問題,也就是鎖能超時自動釋放 3.支援主動釋放鎖 分布式鎖解決什麼問題 多程序併發執行任務時,需要保證任務的有序性或者唯一性 準備 redis版本 2.6 redis是主從 sentinel模式 為了高可用 原理 redis2.6之...

基於 redis setNx 分布式鎖實現

public class redislock public redislock string lockkey,int timeoutmsecs public redislock string lockkey,int timeoutmsecs,int expiremsecs public string...

基於Redis實現分布式鎖

之前專案中使用redis鎖實現秒殺等一些併發業務,在這裡整理一下基於redis實現分布式鎖的簡單入門例項,記錄一下,便於以後檢視 學習。springboot整合redisson分布式鎖 1 簡介 在分布式系統中存在併發場景,為了解決這一問題,基於redis鎖一定程度可以解決這一問題,但是也有缺點,如...