<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

tldb提供分布式鎖使用方法

OSC開源社區 ? 來源:OSCHINA 社區 ? 2023-11-02 14:44 ? 次閱讀

作者:donnie4w

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

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

lock 阻塞式請求鎖

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

unlock 釋放已經獲取的鎖 tldb 提供的分布式鎖功能主要在 MQ 模塊中實現,調用的方法在 MQ 客戶端實現,客戶端的實現實際非常簡單,除了目前已經實現的幾種語言 java,golang,python,javaScript 寫的 simpleClient,其實其他開發者有興趣也可以實現其他語言的 MQ 客戶端,完全沒有技術門檻。分布式鎖由 tldb 服務器控制,所以它相對客戶端來說,也是跨語言的,如,用 java 客戶端上鎖的對象,其他語言同樣無法獲取該對象鎖。

Lock (string,int) 方法的使用

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

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

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

UnLock (string) 方法的使用

UnLock 為釋放分布式鎖時調用的方法??蛻舳嗽诔晒Λ@取分布式鎖后,服務器會返回一個該鎖的 key,客戶端執行完邏輯代碼的最后,必須顯式調用 UnLock (key) 來釋放該分布式鎖。如果沒有調用 unlock 釋放鎖,tldb 將等待鎖釋放的超時時間直至超時后強制釋放該鎖。

TryLock (string,int) 方法的使用

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

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

因為 tldb 分布式的實現是在 MQ 模塊,所以 go 程序必須使用 tlmq-go, tldb 的 mq 客戶端進行調用鎖方法。

   import  "github.com/donnie4w/tlmq-go/cli"

調用 lock 的程序:lock 方法是阻塞的

sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
//以上為 客戶端連接MQ服務器
key, err := sc.Lock("testlock", 3)
//lock中兩個參數,第一個參數為字符串,即tldb服務器為“testlock”分配一個全局的分布式鎖
//第二個參數3為客戶端持有該鎖的最長時間,表示超過3秒沒有釋放鎖時,tldb服務器將在服務端強制釋放該鎖,并分配給其他請求鎖的線程
if err!=nil{
    //獲取鎖失敗,需查看tldb能正常訪問
}else{
    defer sc.UnLock(key) //獲取鎖成功后,必須在程序最后調用Unlock
    //執行業務邏輯程序
}
調用 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,表示已經成功獲取到分布式鎖
    defer sc.UnLock(key) //在程序最后釋放鎖對象
    ...        
}

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

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)
...//業務邏輯代碼
這段程序應該比較易于理解,就是每隔 100 毫秒,循環獲取字符串 “testlock” 的分布式鎖直至成功。

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

        
   io.github.donnie4w      
   tlmq-j     
   0.0.2   

調用 lock 方法

MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
//java連接服務器
String key = null;
try{
      key = mc.lock("testlock", 3); //獲取分布式
      ... //執行業務邏輯程序
}finally {
     if (key!=null){
         mc.unLock(key); //釋放分布式鎖
     }
}

調用 trylock 方法

MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
String key = null;
try{
      key = mc.tryLock("testlock", 3); //獲取分布式
      ... //執行業務邏輯程序
} finally {
     if (key!=null){
         mc.unLock(key); //釋放分布式鎖
     }               
}
以下是 tldb 分布式鎖的功能測試數據:多線程并發 調用 lock 獲取同一個對象鎖后,程序的運行數據:
ecea2568-771a-11ee-939d-92fbcf53809c.png

多線程并發使用自旋的方式調用 trylock 與 lock 獲取同一個對象鎖:
ed0aad24-771a-11ee-939d-92fbcf53809c.png

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8295

    瀏覽量

    83215
  • 數據庫
    +關注

    關注

    7

    文章

    3627

    瀏覽量

    63688
  • 字符串
    +關注

    關注

    1

    文章

    553

    瀏覽量

    20266
  • 代碼
    +關注

    關注

    30

    文章

    4588

    瀏覽量

    67222

原文標題:全新的分布式鎖,功能簡單且強大

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    分布式軟件系統

    三個特點:分布性、通信性和穩健性。 分布式文件系統具有執行遠程文件存取的能力,并以透明方式對分布在網絡上的文件進行管理和存取。 分布式數據庫系統由
    發表于 07-22 14:53

    分布式控制系統

    分布式控制系統分布式控制系統 (distributed control systems,簡稱DCS),又稱為分散控制系統,分散型控制系統,集散控制系統.行業內業稱4C技術既Control控制技術
    發表于 03-01 22:19

    分布式發電技術與微型電網

    幾種分布式發電簡介2.分布式發電與配電網互聯問題3.微型電網技術4.分布式發電(電源)技術應用的障礙和瓶頸5.分布式發電(電源)技術發展方向6.結語
    發表于 03-11 13:37

    淺談分布式緩存技術

    視圖,API接口簡單,與拓撲,動態擴展或故障恢復無關,無需手動配置,自動選擇備份節點,大多數緩存系統提供圖形化管理控制臺,簡單易用保持。分布式緩存優勢1,提高數據讀取速度2,提高系統擴展能力3,降低
    發表于 11-16 15:45

    在 Java 中利用 redis 實現一個分布式服務

    在 Java 中利用 redis 實現一個分布式服務
    發表于 07-05 13:14

    分布式系統的組合相位噪聲性能怎么評估?

    ,它們的貢獻是控制環路以及任何頻率轉換的函數。這會在嘗試評估組合相位噪聲輸出時增加復雜性。本文基于已知的鎖相環建模方法,以及對相關和不相關貢獻因素的評估,提出了跟蹤不同頻率偏移下的分布式PLL貢獻的方法。
    發表于 08-02 08:35

    如何設計分布式干擾系統?

    什么是分布式干擾系統?分布式干擾系統是一種綜合化、一體化、小型化、網絡化和智能化系統,是將眾多體積小,重量輕,廉價的小功率偵察干擾機裝置在易于投放的小型平臺上,撒布在接近***擾目標空域地,通過指令
    發表于 08-08 06:57

    分布式系統的優勢是什么?

    當討論分布式系統時,我們面臨許多以下這些形容詞所描述的 同類型: 分布式的、刪絡的、并行的、并發的和分散的。分布式處理是一個相對較新的領域,所以還沒有‘致的定義。與順序計算相比、并行的、并發的和
    發表于 03-31 09:01

    HarmonyOS應用開發-分布式設計

    不同終端設備之間的極速連接、硬件協同、資源共享,為用戶提供最佳的場景體驗。分布式設計指南可以幫助應用開發者了解如何充分發揮“One Super Device”的能力,提供獨特的跨設備交互體驗。說明:本設計指南后續舉例中將包括手機
    發表于 09-22 17:11

    Qorvo分布式Wi-Fi網格解決方案

    實現互聯世界的創新RF解決方案提供商Qorvo宣布,正使用 802.11ax 產品組合擴大分布式 Wi-Fi 解決方案在住宅中的適用范圍。該產品組合可改善 Wi-Fi 覆蓋范圍,幫助實現更小的器件
    發表于 11-02 07:01

    分布式數據采集系統同步的方法

    本文介紹了基于SAR ADC的系統和基于sigma-delta (∑-Δ) ADC的分布式數據采集系統同步的傳統方法,且探討了這兩種架構之間的區別。我們還將討論同步多個Σ-Δ ADC時遇到的典型不便
    發表于 11-23 10:33

    各種分布式電源的電氣特性

    PS:滲透率的概念:從字面上理解,“滲透”就是由分布式電源發出的功率進入(滲入)到配電系統,所謂的“率”就是由分布式電源發出的電和整個系統所消耗的電(或者說總發電量)的一個比值。各種分布式電源的電氣
    發表于 07-12 07:54

    HarmonyOS分布式應用框架深入解讀

    再局限于單臺設備上,包管理還包括跨虛擬終端上的所有設備。分布式運行管理負責應用動態運行時管理,包括協同框架、遷移框架、服務卡片框架。應用接口層:是系統提供給廣大開發人員開發應用的接口層,不管系統底層實現有多
    發表于 11-22 15:15

    如何高效完成HarmonyOS分布式應用測試?

    作者:liuxun,HarmonyOS測試架構師HarmonyOS是新一代的智能終端操作系統,給開發者提供了設備發現、設備連接、跨設備調用等豐富的分布式API。隨著越來越多的開發者投入到
    發表于 12-13 18:07

    常見的分布式供電技術有哪些?

    燃料電池將氫氣轉化為電能,具有高效率、清潔環保等優勢,能夠提供高品質、高可靠性的電力供應?! ?.燃氣發電技術:利用燃氣機等設備將燃氣轉化為電能,接入分布式電網進行供電,其優點是反應速度快,且燃料相對便宜,但同時還需要考慮燃氣供應和排放問題。
    發表于 04-10 16:28
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>