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

    文章

    8116

    浏览量

    82509
  • 数据库
    +关注

    关注

    7

    文章

    3591

    浏览量

    63369
  • 字符串
    +关注

    关注

    1

    文章

    551

    浏览量

    20123
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66766

原文标题:全新的分布式锁,功能简单且强大

文章出处:【微信号: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

    常见的分布式供电技术有哪些?

    燃料电池将氢气转化为电能,具有高效率、清洁环保等优势,能够提供高品质、高可靠性的电力供应。  5.燃气发电技术:利用燃气机等设备将燃气转化为电能,接入分布式电网进行供电,其优点是反应速度快,且燃料相对便宜,但同时还需要考虑燃气供应和排放问题。
    发表于 04-10 16:28