关于分布式锁:全新的分布式锁功能简单且强大
起源:《全新的分布式锁,性能简略且弱小》前言:分布式锁是分布式系统中一个极为重要的工具。目前有多种分布式锁的设计方案,比方借助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 stringfor { if v, ok := sc.TryLock("testlock", 3); ok { key = v break } else { <-time.After(100* time.Millisecond) }}defer sc.UnLock(key)...//业务逻辑代码这段程序应该比拟易于了解,就是每隔100毫秒,循环获取字符串“testlock”的分布式锁直至胜利。 ...