全新的分布式锁,功能简单且强大
前言:分布式锁是分布式系统中一个极为重要的工具。目前有多种分布式锁的设计方案,比如借助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配置
<dependency> <groupId>io.github.donnie4w</groupId> <artifactId>tlmq-j</artifactId> <version>0.0.2</version> </dependency>
调用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获取同一个对象锁后,程序的运行数据:
多线程并发使用自旋的方式调用trylock与lock获取同一个对象锁:
有任何问题或建议请Email:donnie4w@gmail.com或 https://tlnet.top/contact 发信给我,谢谢!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微软已拥有超过 100 万付费 Copilot 用户
微软 CEO 萨提亚·纳德拉 (Satya Nadella) 日前透露,该公司 GitHub Copilot 软件的付费用户已超过 100 万。 “借助 GitHub Copilot,我们将开发人员的工作效率提高了 55%,我们拥有超过 100 万付费 Copilot 用户。此外,已有超过 37,000 个组织订阅了 Copilot for Business,环比增长 40%。本季度,我们通过 GitHub Copilot Chat 添加了新功能,Shopify 等数字原生企业以及马士基和普华永道等领先企业已在使用这些功能,以提高其软件开发人员的生产力。” 纳德拉表示,Copilot 是其在公司产品线中推广 AI 的众多方式之一。该公司的必应搜索引擎已经与 OpenAI 的 ChatGPT 集成,迄今为止用户参与的聊天数量已“超过 19 亿次”。 他指出,Microsoft Edge 浏览器的市场份额现已连续 10 个季度增长。“本季度,我们推出了新的个性化答案以及对DALL-E 3的支持,帮助人们获得更相关的答案并创建极其逼真的图像。迄今为止,我们已创建了超过 18 亿张图像。借助 ...
- 下一篇
推特年度工程总结,数据感人,什么代码减少 60 万行、节省 1 亿美元
推特官方帐号发布了一年的工程总结,亮点数据包括: 彻底重构 For you 服务和排名系统,代码行数从 700K 减少到 70K,减少了 90%,计算占用量减少了 50%,帖子吞吐量增加了 80%。 重构了技术栈的 API 中间件层,并简化了架构,删除超过 10 万行代码和数千个未使用的内部端,消除未采用的客户端服务。 关闭萨克拉门托数据中心并重新配置 5,200 个机架和 148,000 台服务器,每年节省超过 1 亿美元。 元数据获取后延迟减少了 50%,全局 API 超时错误减少了 90%。 优化了对云服务提供商的使用,在本地进行更多工作,每月云成本降低了 60%。具体是将所有媒体/blob 工件移出云,使得整体云数据存储大小减少了 60%。同时,云数据处理成本降低了 75%。 构建本地 GPU 超级计算集群,并设计、开发和交付 43.2Tbps 的新网络结构架构以支持集群。 扩展网络主干容量和冗余,每年节省 1,390 万美元。 推荐阅读 一名工程师修改配置导致推特宕机,马斯克回应:要彻底重写这堆 "ShitCode" 马斯克硬核迁移推特服务器 马斯克称 Twitter 数据被...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启