亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

作者:donnie4w

鏈接:https://my.oschina.NET/donnie4w/blog/10114233

前言:分布式鎖是分布式系統(tǒng)中一個極為重要的工具。目前有多種分布式鎖的設(shè)計方案,比如借助 redis,mq,數(shù)據(jù)庫,zookeeper 等第三方服務(wù)系統(tǒng)來設(shè)計分布式鎖。tldb 提供的分布式鎖,主要是要簡化這個設(shè)計的過程,提供一個簡潔可靠,類似使用程序中對象鎖的方式來獲取分布式鎖。

tldb 提供分布式鎖使用方法:

  1. lock 阻塞式請求鎖

  2. trylock 嘗試加鎖,若鎖已被占用,則失敗返回,反之,則獲取該鎖

  3. unlock 釋放已經(jīng)獲取的鎖

    tldb 提供的分布式鎖功能主要在 MQ 模塊中實現(xiàn),調(diào)用的方法在 MQ 客戶端實現(xiàn),客戶端的實現(xiàn)實際非常簡單,除了目前已經(jīng)實現(xiàn)的幾種語言 JAVA,golang,Python/ target=_blank class=infotextkey>Python,java 寫的 simpleClient,其實其他開發(fā)者有興趣也可以實現(xiàn)其他語言的 MQ 客戶端,完全沒有技術(shù)門檻。分布式鎖由 tldb 服務(wù)器控制,所以它相對客戶端來說,也是跨語言的,如,用 java 客戶端上鎖的對象,其他語言同樣無法獲取該對象鎖。

Lock (string,int) 方法的使用

tldb 提供的是以字符串為鎖對象的獨占鎖, 如,lock ("abc",3) 必須提供兩個參數(shù):

  1. 第一個參數(shù)為鎖對象,即服務(wù)器對 “abc” 對象分配一個鎖,所有對 "abc" 對象請求加鎖的線程爭用一個獨占鎖,該方法為一個阻塞方法,請求到鎖則返回,如果鎖被其他線程占用,則一直阻塞直至獲取到鎖。

  2. 第二個參數(shù)為持有該分布式鎖的最長時間,單位為秒,例如 lock ("abc",3),意思是,如果超過 3 秒還沒有調(diào)用 unlock 釋放該鎖,服務(wù)器將強制釋放該鎖,繼續(xù)將鎖分配給其他請求的線程。

UnLock (string) 方法的使用
  • UnLock 為釋放分布式鎖時調(diào)用的方法。客戶端在成功獲取分布式鎖后,服務(wù)器會返回一個該鎖的 key,客戶端執(zhí)行完邏輯代碼的最后,必須顯式調(diào)用 UnLock (key) 來釋放該分布式鎖。如果沒有調(diào)用 unlock 釋放鎖,tldb 將等待鎖釋放的超時時間直至超時后強制釋放該鎖。

TryLock (string,int) 方法的使用
  • trylock 與 lock 相似,但是 lock 方法阻塞的,調(diào)用 lock 方法請求分布式鎖時,如果該鎖已經(jīng)被占用,那么 lock 方法將一直等待直至 tldb 服務(wù)器將鎖分配給它,這與程序中獲取獨占鎖的方式一致。而 trylock 時非阻塞的,調(diào)用 trylock 后會立即返回,如果獲取到鎖,tldb 會將標識該鎖的 key 一并返回,如何該鎖已經(jīng)被占用,服務(wù)器將返回空數(shù)據(jù)。

以下以 go 為例使用分布式鎖

因為 tldb 分布式的實現(xiàn)是在 MQ 模塊,所以 go 程序必須使用 tlmq-go, tldb 的 mq 客戶端進行調(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中兩個參數(shù),第一個參數(shù)為字符串,即tldb服務(wù)器為“testlock”分配一個全局的分布式鎖

//第二個參數(shù)3為客戶端持有該鎖的最長時間,表示超過3秒沒有釋放鎖時,tldb服務(wù)器將在服務(wù)端強制釋放該鎖,并分配給其他請求鎖的線程

iferr!=nil{

//獲取鎖失敗,需查看tldb能正常訪問

}else{

defersc.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

ifkey, ok := sc.TryLock("testlock2", 3); ok {

//ok為true,表示已經(jīng)成功獲取到分布式鎖

defersc.UnLock(key) //在程序最后釋放鎖對象

...

}

go 用自旋的方式使用 trylock 獲取分布式鎖,實現(xiàn)程序的阻塞等待

sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")

sc.Connect

varkey string

for{

ifv, ok := sc.TryLock("testlock", 3); ok {

key = v

break

} else{

<-time.After(100* time.Millisecond)

}

}

defersc.UnLock(key)

...//業(yè)務(wù)邏輯代碼

這段程序應(yīng)該比較易于理解,就是每隔 100 毫秒,循環(huán)獲取字符串 “testlock” 的分布式鎖直至成功。

以下以 java 為例java 客戶端為 tlmq-j :https://github.com/donnie4w/tlmq-j

maven 配置

<dependency>

<groupId>io.github.donnie4w</groupId>

<artifactId>tlmq-j</artifactId>

<version>0.0.2</version>

</dependency>

調(diào)用 lock 方法

MqClient mc = newSimpleClient("ws://127.0.0.1:5001", "mymq=123");

mc.connect;

//java連接服務(wù)器

Stringkey = null;

try{

key = mc.lock("testlock", 3); //獲取分布式

... //執(zhí)行業(yè)務(wù)邏輯程序

}finally{

if(key!=null){

mc.unLock(key); //釋放分布式鎖

}

}

調(diào)用 trylock 方法

MqClient mc = newSimpleClient("ws://127.0.0.1:5001", "mymq=123");

mc.connect;

Stringkey = null;

try{

key = mc.tryLock("testlock", 3); //獲取分布式

... //執(zhí)行業(yè)務(wù)邏輯程序

} finally{

if(key!=null){

mc.unLock(key); //釋放分布式鎖

}

}

以下是 tldb 分布式鎖的功能測試數(shù)據(jù):多線程并發(fā) 調(diào)用 lock 獲取同一個對象鎖后,程序的運行數(shù)據(jù):

全新的分布式鎖,功能簡單且強大

多線程并發(fā)使用自旋的方式調(diào)用 trylock 與 lock 獲取同一個對象鎖:

全新的分布式鎖,功能簡單且強大

分享到:
標簽:分布式
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定