上一篇我们简单的介绍一下,etcd的分布式锁java代码,同时也运行了测试过程。在这里我们结合代码来说说etcd分布式锁的执行流程
在etcd分布式锁的执行流程里面,我们主要分为7个步骤
1、建立连接 2、创建一个唯一的竞争key 3、通过唯一的竞争key绑定一个租约 4、客户端判断是否获取到锁 5、获取到锁执行业务 6、执行完毕释放锁 7、下一个线程获取到锁 ...
下面分别独立的给大家演示一下。
1、建立连接
这里的建立建立主要是客户端与etcd服务端建议http连接,因为etcd其实是http的方式进行访问的,在前面演示的代码里面http是由jetcd-core的包封装了的,所以在代码层面来说是看不到的。但是真实的不管是什么开发语言,其实建立的都是http访问。
2、创建一个唯一竞争的key
我们知道在各个业务里面分布式锁主要对唯一的key进行加锁,因为主要是多个线程同时操作同一个对象,因此这里我们主要是对这个对象创建一个唯一的key,能拿到锁就能操作这个对象,拿不到锁则不能操作这个对象。在代码的演示里面,我们以商品id为1的商品为例,创建的一个key:/etcd/good/1
3、通过唯一的竞争key绑定一个租约
当一个客户端持有锁期间,其它客户端只能等待,为了避免等待期间租约失效,客户端需创建一个定时任务作为“心跳”进行续约。此外,如果持有锁期间客户端崩溃,心跳停止,key 将因租约到期而被删除,从而锁释放,避免死锁。这时候正对这个key会生成一个唯一的leaseId。
在这里不管是哪种开发语言,都需要手动的去编写一个子线程进行续约,如果程序出现意外挂了,那么这个key他会有一个ttl时间自动删除。 这个租约主要是保证A现在在拿到锁之后,由于处理任务的时间过长,但是此时又到了key的ttl时间,这时候我们必须要保证A继续持有锁,从而其他线程拿不到锁。最终保证对于数据的处理正确性。
4、客户端判断是否获取到锁
等这些都准备好了的时候,我们可以去拿锁了,看下我们能不能拿到锁。此时客户端以前缀 /etcd/good/1 读取 key-Value 列表,判断自己 key 的 Revision 是否为当前列表中最小的,如果是则认为获得锁;否则监听列表中前一个 Revision 比自己小的 key 的删除事件,一旦监听到删除事件或者因租约失效而删除的事件,则自己获得锁。
5、获取到锁执行业务
当然这里获取到锁之后就可以执行我们对应的业务了。
6、执行完毕释放锁
业务执行完毕,我们需要释放锁,同时刚才提到续租是我们的子线程在跑,所以这里也需要把子线程给停掉。
7、下一个线程继续拿锁执行
下一个线程继续重复上诉步骤,拿锁执行即可。
还没有评论,来说两句吧...