作者:donnie4w
前言:分布式鎖是分布式系統(tǒng)中一個(gè)極為重要的工具。目前有多種分布式鎖的設(shè)計(jì)方案,比如借助 redis,mq,數(shù)據(jù)庫(kù),zookeeper 等第三方服務(wù)系統(tǒng)來(lái)設(shè)計(jì)分布式鎖。tldb 提供的分布式鎖,主要是要簡(jiǎn)化這個(gè)設(shè)計(jì)的過(guò)程,提供一個(gè)簡(jiǎn)潔可靠,類似使用程序中對(duì)象鎖的方式來(lái)獲取分布式鎖。
tldb 提供分布式鎖使用方法:
lock 阻塞式請(qǐng)求鎖
trylock 嘗試加鎖,若鎖已被占用,則失敗返回,反之,則獲取該鎖
unlock 釋放已經(jīng)獲取的鎖 tldb 提供的分布式鎖功能主要在 MQ 模塊中實(shí)現(xiàn),調(diào)用的方法在 MQ 客戶端實(shí)現(xiàn),客戶端的實(shí)現(xiàn)實(shí)際非常簡(jiǎn)單,除了目前已經(jīng)實(shí)現(xiàn)的幾種語(yǔ)言 java,golang,python,javaScript 寫的 simpleClient,其實(shí)其他開發(fā)者有興趣也可以實(shí)現(xiàn)其他語(yǔ)言的 MQ 客戶端,完全沒有技術(shù)門檻。分布式鎖由 tldb 服務(wù)器控制,所以它相對(duì)客戶端來(lái)說(shuō),也是跨語(yǔ)言的,如,用 java 客戶端上鎖的對(duì)象,其他語(yǔ)言同樣無(wú)法獲取該對(duì)象鎖。
Lock (string,int) 方法的使用
tldb 提供的是以字符串為鎖對(duì)象的獨(dú)占鎖, 如,lock ("abc",3) 必須提供兩個(gè)參數(shù):
第一個(gè)參數(shù)為鎖對(duì)象,即服務(wù)器對(duì) “abc” 對(duì)象分配一個(gè)鎖,所有對(duì) "abc" 對(duì)象請(qǐng)求加鎖的線程爭(zhēng)用一個(gè)獨(dú)占鎖,該方法為一個(gè)阻塞方法,請(qǐng)求到鎖則返回,如果鎖被其他線程占用,則一直阻塞直至獲取到鎖。
第二個(gè)參數(shù)為持有該分布式鎖的最長(zhǎng)時(shí)間,單位為秒,例如 lock ("abc",3),意思是,如果超過(guò) 3 秒還沒有調(diào)用 unlock 釋放該鎖,服務(wù)器將強(qiáng)制釋放該鎖,繼續(xù)將鎖分配給其他請(qǐng)求的線程。
UnLock (string) 方法的使用
UnLock 為釋放分布式鎖時(shí)調(diào)用的方法。客戶端在成功獲取分布式鎖后,服務(wù)器會(huì)返回一個(gè)該鎖的 key,客戶端執(zhí)行完邏輯代碼的最后,必須顯式調(diào)用 UnLock (key) 來(lái)釋放該分布式鎖。如果沒有調(diào)用 unlock 釋放鎖,tldb 將等待鎖釋放的超時(shí)時(shí)間直至超時(shí)后強(qiáng)制釋放該鎖。
TryLock (string,int) 方法的使用
trylock 與 lock 相似,但是 lock 方法阻塞的,調(diào)用 lock 方法請(qǐng)求分布式鎖時(shí),如果該鎖已經(jīng)被占用,那么 lock 方法將一直等待直至 tldb 服務(wù)器將鎖分配給它,這與程序中獲取獨(dú)占鎖的方式一致。而 trylock 時(shí)非阻塞的,調(diào)用 trylock 后會(huì)立即返回,如果獲取到鎖,tldb 會(huì)將標(biāo)識(shí)該鎖的 key 一并返回,如何該鎖已經(jīng)被占用,服務(wù)器將返回空數(shù)據(jù)。
以下以 go 為例使用分布式鎖
因?yàn)?tldb 分布式的實(shí)現(xiàn)是在 MQ 模塊,所以 go 程序必須使用 tlmq-go, tldb 的 mq 客戶端進(jìn)行調(diào)用鎖方法。
import "github.com/donnie4w/tlmq-go/cli"
調(diào)用 lock 的程序:lock 方法是阻塞的
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
//以上為 客戶端連接MQ服務(wù)器
key, err := sc.Lock("testlock", 3)
//lock中兩個(gè)參數(shù),第一個(gè)參數(shù)為字符串,即tldb服務(wù)器為“testlock”分配一個(gè)全局的分布式鎖
//第二個(gè)參數(shù)3為客戶端持有該鎖的最長(zhǎng)時(shí)間,表示超過(guò)3秒沒有釋放鎖時(shí),tldb服務(wù)器將在服務(wù)端強(qiáng)制釋放該鎖,并分配給其他請(qǐng)求鎖的線程
if err!=nil{
//獲取鎖失敗,需查看tldb能正常訪問
}else{
defer sc.UnLock(key) //獲取鎖成功后,必須在程序最后調(diào)用Unlock
//執(zhí)行業(yè)務(wù)邏輯程序
}
調(diào)用 tryLock 的程序,trylock 是非阻塞的
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
if key, ok := sc.TryLock("testlock2", 3); ok {
//ok為true,表示已經(jīng)成功獲取到分布式鎖
defer sc.UnLock(key) //在程序最后釋放鎖對(duì)象
...
}
go 用自旋的方式使用 trylock 獲取分布式鎖,實(shí)現(xiàn)程序的阻塞等待
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
var key string
for {
if v, ok := sc.TryLock("testlock", 3); ok {
key = v
break
} else {
<-time.After(100* time.Millisecond)
}
}
defer sc.UnLock(key)
...//業(yè)務(wù)邏輯代碼
這段程序應(yīng)該比較易于理解,就是每隔 100 毫秒,循環(huán)獲取字符串 “testlock” 的分布式鎖直至成功。
以下以 java 為例java 客戶端為 tlmq-j :https://github.com/donnie4w/tlmq-j maven 配置
io.github.donnie4w tlmq-j 0.0.2
調(diào)用 lock 方法
MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
//java連接服務(wù)器
String key = null;
try{
key = mc.lock("testlock", 3); //獲取分布式
... //執(zhí)行業(yè)務(wù)邏輯程序
}finally {
if (key!=null){
mc.unLock(key); //釋放分布式鎖
}
}
調(diào)用 trylock 方法
MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
String key = null;
try{
key = mc.tryLock("testlock", 3); //獲取分布式
... //執(zhí)行業(yè)務(wù)邏輯程序
} finally {
if (key!=null){
mc.unLock(key); //釋放分布式鎖
}
}
以下是 tldb 分布式鎖的功能測(cè)試數(shù)據(jù):多線程并發(fā) 調(diào)用 lock 獲取同一個(gè)對(duì)象鎖后,程序的運(yùn)行數(shù)據(jù):
多線程并發(fā)使用自旋的方式調(diào)用 trylock 與 lock 獲取同一個(gè)對(duì)象鎖:

審核編輯:湯梓紅
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
10013瀏覽量
90384 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3984瀏覽量
67543 -
字符串
+關(guān)注
關(guān)注
1文章
594瀏覽量
22964 -
代碼
+關(guān)注
關(guān)注
30文章
4927瀏覽量
72489
原文標(biāo)題:全新的分布式鎖,功能簡(jiǎn)單且強(qiáng)大
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Redis 分布式鎖的正確實(shí)現(xiàn)方式
為什么需要分布式鎖 基于Zookeeper鎖安全嗎
深入理解redis分布式鎖
Redis實(shí)現(xiàn)分布式鎖的幾種方案
什么是分布式鎖 Redis的五種分布式鎖方案

tldb提供分布式鎖使用方法
評(píng)論