[发明专利]一种可重入的分布式排它锁实现方法在审
申请号: | 202011337950.5 | 申请日: | 2020-11-25 |
公开(公告)号: | CN112667409A | 公开(公告)日: | 2021-04-16 |
发明(设计)人: | 王君 | 申请(专利权)人: | 紫光云技术有限公司 |
主分类号: | G06F9/52 | 分类号: | G06F9/52;H04L29/06 |
代理公司: | 天津滨海科纬知识产权代理有限公司 12211 | 代理人: | 刘莹 |
地址: | 300459 天津市滨海新区*** | 国省代码: | 天津;12 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 可重入 分布式 实现 方法 | ||
本发明提供了一种可重入的分布式排它锁实现方法,包括:定义锁;通过zookeeper定义锁,将zookeeper上的其中一个数据节点定义为一个锁;获取锁:获取排他锁时,客户端首先判断是否存在数据节点,如果不存在,则创建,并且在该锁节点下创建带有线程id和lock标识的有序临时节点;如果存在,则直接在该锁节点下创建有序临时节点;然后各个客户端判断本线程创建的临时节点的序列号是否是最小的,如果是最小的则获取锁,如果不是则需要进一步判断是否本线程占用的锁,如果是,则可以获取锁,如果不是则等待锁。本发明所述的可重入的分布式排它锁实现方法,具有可重入性,保证互斥锁的可重入性。
技术领域
本发明属于互联网技术领域,尤其是涉及一种可重入的分布式排它锁实现方法。
背景技术
在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。然而在很多场景中,我们需要保证一个方法在同一时间内只能被同一个线程执行,这就需要用到分布式锁。分布式锁是控制分布式系统之间同步访问共享资源的一种方式,如果不同的系统或者同一个系统的不同的主机或服务之间共享一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,这种情况下就需要使用分布式锁。
针对分布式锁的实现,目前比较常用的有以下几种方案:基于数据库实现分布式锁;基于缓存redis实现分布式锁;基于Zookeeper实现分布式锁。
基于数据库实现分布式锁缺点:
1、这把锁强依赖数据库的可用性,数据库是一个单点,一旦数据库挂掉,会导致业务系统不可用。
2、这把锁没有失效时间,一旦解锁操作失败,就会导致锁记录一直在数据库中,其他线程无法再获得到锁。
3、这把锁只能是非阻塞的,因为数据的insert操作,一旦插入失败就会直接报错。没有获得锁的线程并不会进入排队队列,要想再次获得锁就要再次触发获得锁操作。
4、这把锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁。因为数据中数据已经存在了。
基于缓存redis实现分布式锁缺点:
如果Redis是主从架构,客户端A从master获取到锁,在master将锁同步到slave之前,master宕掉了。此时slave节点被晋级为master节点,客户端B取得了同一个资源被客户端A已经获取到的另外一个锁。
基于Zookeeper实现分布式锁缺点:
现有基于Zookeeper分布式锁没有可重入性。
发明内容
有鉴于此,为克服上述缺陷,本发明旨在提出一种可重入的分布式排它锁实现方法。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种可重入的分布式排它锁实现方法,包括:
定义锁;通过zookeeper定义锁,将zookeeper上的其中一个数据节点定义为一个锁;
获取锁:获取排他锁时,客户端首先判断是否存在数据节点,如果不存在,则创建,并且在该锁节点下创建带有线程id和lock标识的有序临时节点;如果存在,则直接在该锁节点下创建有序临时节点;然后各个客户端判断本线程创建的临时节点的序列号是否是最小的,如果是最小的则获取锁,如果不是则需要进一步判断是否本线程占用的锁,如果是,则可以获取锁,如果不是则等待锁。
进一步的,获取锁的具体方法如下:
S1、首先判断是否有数据节点,如果没有则创建,如果有则需要进一步判断;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于紫光云技术有限公司,未经紫光云技术有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202011337950.5/2.html,转载请声明来源钻瓜专利网。