作者:donnie4w
链接:https://my.oschina.net/donnie4w/blog/10114233
前言:分布式锁是分布式系统中一个极为重要的工具。目前有多种分布式锁的设计方案,比如借助 redis,mq,数据库,zookeeper 等第三方服务系统来设计分布式锁。tldb 提供的分布式锁,主要是要简化这个设计的过程,提供一个简洁可靠,类似使用程序中对象锁的方式来获取分布式锁。
tldb 提供分布式锁使用方法:
tldb 提供的是以字符串为锁对象的独占锁, 如,lock ("abc",3) 必须提供两个参数:
以下以 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-jmaven 配置
<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 获取同一个对象锁:
往期推荐
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦