CN110971700A - 分布式锁的实现方法及装置 - Google Patents
分布式锁的实现方法及装置 Download PDFInfo
- Publication number
- CN110971700A CN110971700A CN201911255781.8A CN201911255781A CN110971700A CN 110971700 A CN110971700 A CN 110971700A CN 201911255781 A CN201911255781 A CN 201911255781A CN 110971700 A CN110971700 A CN 110971700A
- Authority
- CN
- China
- Prior art keywords
- lock
- thread
- queue
- distributed
- acquisition information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种分布式锁的实现方法及装置,涉及云计算技术领域;方法包括:响应于目标线程发送的针对分布式锁的锁获取请求,确定目标线程对应的锁获取信息;将锁获取信息分别存储至本地队列及远端队列;本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;远端队列,用于存储对应全局服务实例的锁获取信息,远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致;检测到目标线程对应的锁获取信息位于本地队列的队首及远端队列的队首时,确定目标线程具有分布式锁权限;通知目标线程,以使目标线程基于分布式锁权限,访问分布式锁对应的资源。
Description
技术领域
本发明涉及云计算技术领域,尤其涉及一种分布式锁的实现方法及装置。
背景技术
云计算(Cloud Computing)指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需资源;广义云计算指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需服务。这种服务可以是IT和软件、互联网相关,也可是其他服务。云计算是网格计算(Grid Computing)、分布式计算(Distributed Computing)、并行计算(Parallel Computing)、效用计算(Utility Computing)、网络存储(Network StorageTechnologies)、虚拟化(Virtualization)、负载均衡(Load Balance)等传统计算机和网络技术发展融合的产物。
随着互联网、实时数据流、连接设备多样化的发展,以及搜索服务、社会网络、移动商务和开放协作等需求的推动,云计算迅速发展起来。不同于以往的并行分布式计算,云计算的产生从理念上将推动整个互联网模式、企业管理模式发生革命性的变革。
在云计算场景中,为了保证数据的分布式一致性,不同的进程需要通过分布式锁来访问共享资源,来防止彼此干扰。
相关技术中,提供一种基于Redis的分布式锁实现方法,在分布式锁被占用时,在Redis数据库中创建一个全局唯一的键值,以标识分布式锁权限已经被占用;在分布式锁被释放后,删除该键值。然而,相关技术提供的是一种不公平锁,即当一个线程想要获取分布式锁时,直接发送锁获取请求;当该分布式锁被占用时,所有想要获取该分布式锁的线程通过重试来进行竞争,如此,由于分布式锁在分配过程中存在一定的随机性,会出现锁饥饿的问题,导致分布式系统出现一定比例的失败请求;并且,若每个服务实例中多个线程都反复进行重试,也会极大增加存储组件的访问压力。
发明内容
本发明实施例提供一种分布式锁的实现方法及装置,能够保证分布式锁权限的有序分配,避免出现失败请求,同时缓解了存储组件的访问压力。
本发明实施例的技术方案是这样实现的:
本发明实施例提供一种分布式锁的实现方法,包括:
响应于目标线程发送的针对分布式锁的锁获取请求,确定所述目标线程对应的锁获取信息;
将所述锁获取信息分别存储至本地队列及远端队列;
其中,所述本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;所述远端队列,用于存储对应全局服务实例的锁获取信息,所述远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致;
检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限;
通知所述目标线程,以使所述目标线程基于所述分布式锁的权限,访问所述分布式锁对应的资源。
本发明实施例提供一种分布式锁的实现装置,包括:
确定模块,用于响应于目标线程发送的针对分布式锁的锁获取请求,确定所述目标线程对应的锁获取信息;
存储模块,用于将所述锁获取信息分别存储至本地队列及远端队列;
其中,所述本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;所述远端队列,用于存储对应全局服务实例的锁获取信息,所述远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致;
检测模块,用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限;
通知模块,用于通知所述目标线程,以使所述目标线程基于所述分布式锁的权限,访问所述分布式锁对应的资源。
上述方案中,所述确定模块,还用于基于所述锁获取请求,生成对应所述目标线程的线程标识;
所述存储模块,还用于将所述线程标识存储至对应所述分布式锁的本地队列的队尾,并将所述线程标识存储至对应所述分布式锁的远端队列的队尾。
上述方案中,所述确定模块,还用于解析所述锁获取请求,得到对应所述锁获取请求的机器网际协议地址IP、进程号及线程号;
基于所述机器IP、进程号及线程号,生成对应所述目标线程的线程标识。
上述方案中,所述存储模块,还用于检测到对应所述分布式锁的本地队列不存在时,创建对应所述分布式锁的本地队列;
将对应所述目标线程的线程标识存储至创建的对应所述分布式锁的本地队列的队尾。
上述方案中,所述装置还包括:
删除模块,用于确定所述本地队列在预设时长内处于空闲状态时,删除对应所述本地队列。
上述方案中,所述检测模块,还用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,在所述远端队列设置所述目标线程所对应的第一超时时间;
所述第一超时时间用于指示所述分布式锁权限的自动释放时间,表征在所述第一超时时间前所述目标线程具有所述分布式锁权限。
上述方案中,所述检测模块,还用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首,且不位于所述远端队列的队首时,将当前时间与位于所述远端队列的队首的锁获取信息所对应的第二超时时间进行比较;
当所述当前时间大于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限超时;
将位于所述远端队首的锁获取信息从所述远端队列中删除。
上述方案中,所述检测模块,还用于当所述当前时间小于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限未超时;
周期性检测所述目标线程对应的所述锁获取信息是否位于所述远端队列的队首。
上述方案中,所述删除模块,还用于接收到目标线程发送的针对分布式锁的锁释放请求;
删除所述本地队列及远端队列中所述目标线程对应的所述锁获取信息。
本发明实施例提供一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本发明实施例提供的分布式锁的实现方法。
本发明实施例提供一种存储介质,存储有可执行指令,用于引起处理器执行时,实现本发明实施例提供的分布式锁的实现方法。
本发明实施例具有以下有益效果:
1)通过将目标线程对应的锁获取信息分别存储至本地队列及远端队列,由于远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致,如此,能够保证分布式锁权限的有序分配,避免出现失败请求;
2)通过检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限,由于本地队列用于存储归属于同一服务实例的多个线程对应的锁获取信息,能够对同一服务实例的多个线程发送的锁获取请求进行统一管理,而不需要每个线程都反复进行重试,如此,能够降低存储组件的访问压力。
附图说明
图1是本发明实施例提供的分布式锁的实现系统100的架构示意图;
图2是本发明实施例提供的电子设备的结构示意图;
图3是本发明实施例提供的分布式锁的实现方法的流程示意图;
图4A-4C是本发明实施例提供的分布式锁权限获取的示意图;
图5是本发明实施例提供的远端队列的示意图;
图6是本发明实施例提供的分布式锁的实现方法的流程示意图;
图7是本发明实施例提供的分布式锁的实现系统的架构示意图;
图8是本发明实施例提供的分布式锁的实现方法的流程示意图;
图9是本发明实施例提供的分布式锁的实现系统的架构示意图;
图10A-10B是本发明实施例提供的分布式锁权限获取的示意图;
图11是本发明实施例提供的分布式锁的实现装置的组成结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,所描述的实施例不应视为对本发明的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
在以下的描述中,所涉及的术语“第一\第二”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本发明实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本发明实施例的目的,不是旨在限制本发明。
对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
1)分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在不同进程需要访问共享资源时,往往需要通过互斥来防止不同进程彼此干扰,以保证一致性,在这种情况下,便需要用到分布式锁。和普通锁的区别在于,分布式锁通常存储在一个独立组件中,所有进程或线程通过接口获取或释放锁资源。
2)公平锁:在分配分布式锁权限之前,先查看是否有排队等待的线程,若有,则优先将分布式锁权限分配给排在前面的线程,即先来先得。
3)非公平锁:在分配分布式锁权限采用随机分配的方式,即所有线程直接发送分布式锁获取请求,若分布式锁被占用,则需要获取该分布式锁的所有线程通过重试进行竞争。
4)服务实例,在分布式系统中,每个服务都部署为一组服务实例,以提高吞吐率和可用性,通常每个服务实例是一个单独的进程。
5)全局服务实例,指一个分布式系统中全部的服务实例。
6)有效时间,指预计持有分布式锁权限的时长,表示从获得分布式锁权限的时刻开始,若超过有效时间仍未主动释放分布式锁权限,则该分布式锁权限将被自动释放,使得该分布式锁权限可以被其余线程获取,从而避免死锁。
7)超时时间,指分布式锁权限的自动释放时间,表示在到达超时时间后,分布式锁权限将被自动释放,用于避免由于获得分布式锁权限的线程处理超时或宕机等问题导致死锁。
8)KV数据库,指Key-value数据库,是一种以键值对存储数据的一种数据库。
9)锁饥饿,当分布式锁权限分配策略不公平时,某些线程可能会长时间等待才能得到分布式锁权限,当等待时间给线程推进和响应带来明显影响时,称发生了线程饥饿;当饥饿到一定程度的线程因取锁等待时间过长最终处理失败,称该进程被饿死。
10)死锁,指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
为实现分布式锁,相关技术中提供的Redis分布式锁的实现方法,其实现的是一种非公平锁,由于没有排队机制,当系统并发较高时,很有可能出现锁饥饿问题,即多个线程进行分布式锁竞争时,分布式锁权限被某个线程先占用了,则其余线程只好进行反复重试,重试过程存在随机性,先发起取锁请求的线程往往不一定能先获得锁权限,反而某些后发起请求的线程在尝试后有可能先取得了分布式锁权限。这种不公平的处理方式,会导致分布式系统出现一定比例的失败请求。同时,若每个服务实例中多个线程都反复进行重试,也会极大增加存储组件的访问压力。
相关技术中还提供了一种基于多实例部署的分布式锁的实现方法,称为RedLock。该方法需要在不同的计算机或者虚拟机上运行多个主节点来保证它们大多数情况下都不会同时宕机,从而解决简单方案中存在的安全互斥问题,比如在宕机期间,多个线程可能同时都持有锁。但是这使得数据库部署变得十分麻烦,会造成一定的存储资源浪费,且在集群版部署方式下是不可用的。RedLock分布式锁的实现方法提高了实现和推广应用的门槛。并且,该方法的安全性问题目前仍然存在着一些争议。
本发明提出了一种分布式锁的实现方法,实现方法简单,能够提供安全一致的公平分布式锁,保证分布式锁权限的有序分配,避免出现失败请求;同时,能够降低存储组件的访问压力。
参见图1,图1是本发明实施例提供的分布式锁的实现系统100的架构示意图,为实现支撑一个示例性应用,分布式锁的实现系统中包括多个服务实例300(示例性示出了服务实例300-1和服务实例300-2)及远端数据库200。其中,每个服务实例包括多个线程(示例性示出了服务实例300-1包括的线程311-1、线程312-1及线程313-1,服务实例300-2包括的线程311-2、线程312-2及线程313-2)、锁管理器(示例性示出了服务实例300-1包括的锁管理器320-1和服务实例300-2包括的锁管理器320-2)及多个本地队列(示例性示出了服务实例300-1包括的本地队列331-1和本地队列332-1、以及服务实例300-2包括的本地队列331-2和本地队列332-2);远端数据库200包括多个远端队列(示例性示出了远端队列211、远端队列212)。
在实际实施时,每个服务实例中,通过锁管理器对本服务实例中所有分布式锁的获取进行管理,当线程需要获取分布式锁时,发送所获取请求至所管理器,由锁管理器作为代理连接远端数据库,执行分布式锁相关操作,并将结果反馈给线程。
以线程311-1作为目标线程为例,说明本发明实施例提供的分布式锁的实现系统。
线程311-1,用于发送锁获取请求至锁管理器320-1;
锁管理器320-1,用于响应于线程311-1发送的锁获取请求,确定线程311-1对应的锁获取信息;将锁获取信息分别存储至本地队列及远端队列;检测到线程311-1对应的锁获取信息位于本地队列的队首及远端队列的队首时,确定线程311-1具有分布式锁权限;通知线程311-1;
其中,本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;远端队列,用于存储对应全局服务实例的锁获取信息,远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致。
线程311-1,还用于基于分布式锁权限,访问分布式锁对应的资源。
接下来对实施本发明实施例的分布式锁的实现方法的电子设备进行说明。在一些实施例中,电子设备可以为终端,还可以为服务器。
服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。
参见图2,图2是本发明实施例提供的电子设备的结构示意图,图2所示的电子设备包括:处理器410、存储器450、网络接口420和用户接口430。电子设备中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统440。
处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口430包括使得能够呈现媒体内容的一个或多个输出装置431,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口430还包括一个或多个输入装置432,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Me mory),易失性存储器可以是随机存取存储器(RAM,Random Access Memor y)。本发明实施例描述的存储器450旨在包括任意适合类型的存储器。
在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他计算设备,示例性的网络接口420包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
显示模块453,用于经由一个或多个与用户接口430相关联的输出装置431(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
输入处理模块454,用于对一个或多个来自一个或多个输入装置432之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本发明实施例提供的分布式锁的实现装置可以采用软件方式实现,图2示出了存储在存储器450中的分布式锁的实现装置455,其可以是程序和插件等形式的软件,包括以下软件模块:确定模块4551、存储模块4552、检测模块4553及通知模块4554,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分,将在下文中说明各个模块的功能。
在另一些实施例中,本发明实施例提供的分布式锁的实现装置可以采用硬件方式实现,作为示例,本发明实施例提供的分布式锁的实现装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本发明实施例提供的分布式锁的实现方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application SpecificIntegrated Circuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)、现场可编程门阵列(FPGA,Field-Pro grammable Gate Array)或其他电子元件。
基于上述对本发明实施例的分布式锁的实现系统及电子设备的说明,接下来对本发明实施例提供的分布式锁的实现方法的流程示意图,图3为本发明实施例提供的分布式锁的实现方法的流程示意图,结合图1及图3,对本发明实施例提供的分布式锁的实现方法进行说明。
步骤501:锁管理器响应于目标线程发送的针对分布式锁的锁获取请求,确定目标线程对应的锁获取信息。
这里,在分布式系统中存在多个服务实例,每个服务实例中包含多个线程。在每个服务实例设置一个锁管理器,用于接收当前服务实例中所有线程发送的锁获取请求,并处理接收到的锁获取请求。
在实际实施时,目标线程需要获取分布式锁时,将针对分布式锁的锁获取请求发送至包含目标线程的服务实例中的锁管理器,锁管理器根据接收到的锁获取请求,确定目标线程对应的锁获取信息。
在一些实施例中,锁管理器可以通过以下方式确定目标线程对应的锁获取信息:基于锁获取请求,生成对应目标线程的线程标识。
在实际实施时,根据锁获取请求,为目标线程生成一个全局唯一的线程标识,如A、B…F,以能够根据线程标识,确定出所有发送锁获取请求的线程,进而根据线程标识,实现分布式锁权限的有序分配。
在一些实施例中,锁管理器可以通过以下方式生成对应目标线程的线程标识:解析锁获取请求,得到对应锁获取请求的机器网际协议地址IP、进程号及线程号;基于机器IP、进程号及线程号,生成对应目标线程的线程标识。
这里,分布式系统由多个机器构成,一个机器部署有多个服务实例,一个服务实例又包含多个线程。若需要唯一确定出目标线程,则需要先根据机器IP可以确定出部署有包含目标线程的服务实例的机器,然后根据进程号在该机器中部署的多个服务实例中确定出包含目标线程的服务实例,再根据线程号从服务实例包含的多个线程中确定出目标线程。因此,需要根据机器IP、进程号及线程号,才能生成对应目标线程的全局唯一的线程标识。
步骤502:将锁获取信息分别存储至本地队列及远端队列。
其中,本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;远端队列,用于存储对应全局服务实例的锁获取信息,远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致。
在实际实施时,在每个服务实例中建立本地队列,在任一远端存储组件建立远端队列。其中,远端存储组件可以为KV数据库。锁管理器每接收到一个线程发送的锁获取请求,就直接将该所获取请求对应的锁获取信息存储至本地队列及远端队列,使得本地队列与远端队列中锁获取信息的存储顺序与相应线程发送锁获取请求的顺序相同,如此,通过队列实现了对分布式锁的公平分配,避免了锁饥饿的问题。
并且,由于服务实例中建立有本地队列,对同一服务实例的多个线程对应的锁获取信息进行排序,使得能够对同一服务实例的多个线程发送的锁获取请求进行统一管理,减少了分布式锁竞争重试时带给存储组件成倍的访问压力。
在一些实施例中,当确定的锁获取信息为对应目标线程的线程标识,相应的,将线程标识存储至对应分布式锁的本地队列的队尾,并将线程标识存储至对应分布式锁的远端队列的队尾。
这里,本地队列可以为多个,分别对应不同的分布式锁;相应的,远端队列也可以为多个,分别对应不同的分布式锁。在实际实施时,目标线程发送的锁获取请求中携带有所要获取的分布式锁的信息,如分布式锁标识,锁管理器根据目标线程发送的锁获取请求中分布式锁的信息,确定目标线程所要获取的分布式锁,然后将锁获取信息存储至对应该分布式锁的本地队列的队尾及对应该分布式锁的远端队列的队尾。
需要说明的是,锁管理器在将线程标识存储至对应分布式锁的远端队列的队尾时,会对应设置目标线程的有效时间。在实际实施时,有效时间携带在目标线程发送的锁获取请求中,锁管理器从锁获取请求中获取有效时间,然后将生成的线程标识与有效时间以键值对的形式添加至远端队列的队尾。
本发明实施例,通过将有效时间存储至远端队列,以在线程获取到分布式锁权限时,可以根据有效时间设置超时时间,进而在线程持有该分布式锁权限超时时,自动释放分布式锁权限,避免死锁的问题。
在实际实施时,本地队列的数目会根据所获取请求的不同而动态变化。在一些实施例中,锁管理器可以通过以下方式将线程标识存储至对应分布式锁的本地队列的队尾:检测到对应分布式锁的本地队列不存在时,创建对应分布式锁的本地队列;将对应目标线程的线程标识存储至创建的对应分布式锁的本地队列的队尾。
在实际实施时,锁管理器在存储目标线程的线程标识之前,会先检测当前服务实例中是否存在对应目标线程请求获取的分布式锁的本地队列,若存在,则直接将线程标识存储至对应分布式锁的本地队列的队尾;若不存在,则锁管理器先创建一个本地队列,用于存储请求该分布式锁的线程标识,再将线程标识存储至对应分布式锁的本地队列的队尾。在创建本地队列的同时,需要从线程池中取出一个线程,用于监控对应该分布式锁的本地队列及远端队列的状态。
在一些实施例中,当本地队列在预设时长内处于空闲状态时,锁管理器删除本地队列。
这里,本地队列处于空闲状态指本地队列中没有存储锁获取信息,在实际实施时,当本地队列在预设时长内处于空闲状态时,锁管理器可以将本地队列回收,并将用于监控该本地队列的线程重新放回线程池中,如此,能够避免反复的线程创建及销毁。
步骤503:检测到目标线程对应的锁获取信息位于本地队列的队首及远端队列的队首时,确定目标线程具有分布式锁权限。
在实际实施时,服务实例中包括用于监控本地队列及远端队列的线程,通过该线程,检测目标线程对应的所获取信息是否位于本地队列的队首,以及检测目标线程对应的所获取信息是否位于远端队列的队首。
这里,由于本地队列是对同一服务实例中线程获取分布式锁权限的顺序进行排列,而远端队列是对全局线程获取分布式锁权限的顺序进行排列,因此,只有目标线程对应的锁获取信息位于本地队列的队首,且位于远端队列的队首时,目标线程才能够获取到分布式锁权限。
在实际实施时,锁管理器首先确定目标线程对应的锁获取信息是否位于本地队列的队首,若是,则进一步检测远端队列队首的锁获取信息是够为目标线程对应的锁获取信息,若是,则表征目标线程能够获取到分布式锁权限。
例如,目标线程为锁获取信息“A”所对应的线程,图4A-4C为本发明实施例提供的分布式锁权限获取的示意图,参见图4A,本地队列队首的锁获取信息为A,远端队列队首的锁获取信息也为A,可以确定目标线程具有分布式权限;参见图4B,本地队列队首的锁获取信息为A,但远端队列队首的锁获取信息为D,表征目标线程不具有分布式权限;参见图4C,本地队列队首的锁获取信息为C,远端队列队首的锁获取信息为D,即目标线程对应的所获取信息既可以确定目标线程不具有分布式权限。
本发明实施例,锁管理器通过本地队列对同一服务实例的多个线程对应的锁获取信息进行了排序,使得在同一服务实例中,位于本地队列队首的锁获取信息所对应的线程必然优先于其它线程获取分布式锁权限。如此,在实际实施时,锁管理器只需要检测本地队列队首的锁获取信息是否也位于远端队列的队首,来确定本服务实例中是否有线程获取到分布式锁权限,相对于各线程直接向远端发送获取请求,本发明实施例减少了各线程在在竞争分布式锁权限时带给存储组件的访问压力。
在一些实施例中,锁管理器可以通过以下方式确定目标线程具有分布式锁权限:检测到目标线程对应的锁获取信息位于本地队列的队首及远端队列的队首时,在远端队列设置目标线程所对应的第一超时时间;第一超时时间用于指示分布式锁权限的自动释放时间,表征在第一超时时间前目标线程具有分布式锁权限。
在实际实施时,锁管理器在检测到目标线程对应的锁获取信息位于本地队列的队首及远端队列的队首时,根据当前时间与目标线程的有效时间,确定目标线程所对应的第一超时时间,其中,有效时间是携带于目标线程发送的锁获取请求中的,在锁管理器将锁获取信息存储至远端队列的同时,还将有效时间存储至远端队列;当锁管理器在检测到目标线程对应的锁获取信息时,通过将有效时间加上当前时间,得到超时时间。
例如,目标线程所对应的有效时间为1秒,当前时间为10:51:12,那么第一超时时间为10:51:12,表示在10:51:12至10:51:12的时间段内,目标线程具有分布式锁权限。
图5为本发明实施例提供的远端队列的示意图,参见图5,远端队列中存储有请求获取分布式锁的锁获取信息、及相应的超时时间或有效时间,其中,锁获取信息为线程标识,远端队列队首存储的是线程标识及其对应的超时时间,而其它为线程标识及其对应的有效时间。当位于远端队列队首的线程标识A所对应的线程释放分布式锁权限后,该线程标识A及其超时时间会被删除,然后线程标识D及其对应的有效时间位于远端队列队首,此时,需要将该有效时间修改为超时时间。
在一些实施例中,锁管理器检测到目标线程对应的锁获取信息位于本地队列的队首,且不位于远端队列的队首时,将当前时间与位于远端队列的队首的锁获取信息所对应的第二超时时间进行比较;当当前时间大于第二超时时间时,确定位于远端队列队首的锁获取信息所对应的线程的分布式锁权限超时;将位于远端队首的锁获取信息从远端队列中删除。
在实际实施时,当目标线程对应的锁获取信息位于本地队列的队首,但不位于远端队列的队首时,需要判断远端队列队首的锁获取信息所对应的线程的分布式权限是否超时,若超时,则需要删除远端队首的锁获取信息。其中,每个服务实例的锁管理器均具有删除远端队列中超时的锁获取信息的权限,以使其它线程能够获取到分布式锁权限,避免远端队列队首的锁获取信息所对应的线程出现异常时,其始终占据远端队列队首位置,导致的死锁问题。
需要说明的是,在实际实施时,在锁管理器将位于远端队首的锁获取信息从远端队列中删除后,执行该删除操作的锁管理器需要为新的位于远端队首的锁获取信息所对应的线程设置超时时间。这里,超时时间的设置方式也是根据该线程的有效时间和当前时间进行设置。如此,可以避免新的远端队首的锁获取信息所对应的线程出现异常时,始终占据远端队列队首位置,导致的死锁问题。
在实际实施时,在锁管理器删除远端队首的锁获取信息后,锁管理信息后重新检测目标线程对应的锁获取信息是否位于远端队列队首。
在一些实施例中,当所述当前时间小于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限未超时;周期性检测所述目标线程对应的所述锁获取信息是否位于所述远端队列的队首。
在实际实施时,当目标线程对应的锁获取信息位于本地队列的队首,但不位于远端队列的队首时,需要判断远端队列队首的锁获取信息所对应的线程的分布式权限是否超时,若未超时,则需要通过重试,循环检测目标线程对应的锁获取信息是否位于所述远端队列的队首。
步骤504:通知目标线程,以使目标线程基于分布式锁权限,访问分布式锁对应的资源。
在实际实施时,当锁管理器确定目标线程具有锁获取权限后,需要通知目标线程,目标线程
在一些实施例中,在目标线程获取到分布式锁权限后,可以主动释放该分布式锁权限:接收到目标线程发送的针对分布式锁的锁释放请求;删除本地队列及远端队列中目标线程对应的锁获取信息。
在实际实施时,当目标线程访问分布式锁对应的资源,并执行相应操作后,可以主动释放分布式锁权限,以使其它线程能够获取该分布式锁权限。当目标线程需要主动释放分布式锁权限时,可以发送锁释放请求给锁管理器,锁管理器根据锁释放请求,进行对发送锁释放请求的线程验证,确定该线程为目标线程时,删除本地队列及远端队列中目标线程对应的锁获取信息。
在一些实施例中,当目标线程持有分布式锁权限超时、或目标线程因宕机等原因没有在超时前主动释放分布式锁权限时,分布式锁权限可以被自动释放,也即其他服务线程中的锁管理器在检测到目标线程持有分布式锁权限超时后,会在远端队列中将目标线程对应的锁获取信息删除,以使得其它线程能够获取到该分布式锁权限。
本发明实施例,一方面,通过将目标线程对应的锁获取信息分别存储至本地队列及远端队列,由于源端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致,如此,能够保证分布式锁权限的有序分配,避免出现失败请求;另一方面,通过检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限,由于本地队列用于存储归属于同一服务实例的多个线程对应的锁获取信息,能够对同一服务实例的多个线程发送的锁获取请求进行统一管理,而不需要每个线程都反复进行重试,如此,能够降低存储组件的访问压力。
图6为本发明实施例提供的分布式锁的实现方法的流程示意图,参见图6,本发明实施例的分布式锁的实现方法包括:
步骤601:目标线程发送针对目标分布式锁的锁获取请求至锁管理器。
这里,在分布式系统中存在多个服务实例,每个服务实例中包含多个线程。在每个服务实例设置一个锁管理器,用于接收当前服务实例中所有线程发送的锁获取请求,并处理接收到的锁获取请求。
在实际实施时,目标线程需要获取分布式锁时,将针对分布式锁的锁获取请求发送至其所属服务实例中的锁管理器。
步骤602:锁管理器解析锁获取请求,得到机器IP、进程号、线程号、目标分布式锁的锁名、有效时间。
步骤603:锁管理器根据机器IP、进程号及线程号,生成对应目标线程的线程标识。
这里,机器IP为部署有包含目标线程的服务实例的机器的IP,进程号对应包含目标线程的服务实例,线程号用于从服务实例包含的多个线程中确定出目标线程。
步骤604:锁管理器根据目标分布式锁的锁名,确定对应目标分布式锁的目标本地队列及对应目标分布式锁的目标远端队列。
需要说明的是,本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;远端队列,用于存储对应全局服务实例的锁获取信息,远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致。
这里,服务实例中存在多个本地队列,分别对应不同的分布式锁;相应的,远端队列也可以为多个,分别对应不同的分布式锁。在实际实施时,锁管理器需要根据目标分布式锁的锁名,从多个本地队列中确定出目标本地队列,以及从多个远端队列确定出目标远端队列。
在实际实施时,本地队列的数目会根据锁获取请求的不同而动态变化。当对应目标分布式锁的本地队列不存在时,锁管理器会创建目标本地队列;若存在本地队列在预设时长内未存储锁获取信息,锁管理器会删除该本地队列。
步骤605:锁管理器将生成的线程标识存储至目标本地队列的队尾。
步骤606:锁管理器将生成的线程标识及对应的有效时间以键值对的形式存储至目标远端队列的队尾。
步骤607:锁管理器检测到目标线程的线程标识位于目标本地队列的队首时,检测目标线程的线程标识是否位于目标远端队列的队首。
在实际实施时,由于在同一服务实例中,位于本地队列队首的锁获取信息所对应的线程必然优先于其它线程获取分布式锁权限,因此,只有在目标线程的线程标识位于目标本地队列的队首时,才需要检测目标线程的线程标识是否位于目标远端队列的队首。
步骤608:锁管理器检测到目标线程的线程标识位于目标远端队列的队首时,从远端队列中获取目标线程的有效时间,并获取当前时间。
在另一些实施例中,若检测到目标线程的线程标识不位于目标远端队列的队首,则判断目标远端队列队首对应的线程持有分布式锁权限是否超时,若超时,则删除目标远端队列队首的线程标识及其超时时间,并为新的目标远端队列队首的线程标识设置超时时间,然后重新检测目标线程的线程标识是否位于目标远端队列的队首;若未超时,则直接重新检测目标线程的线程标识是否位于目标远端队列的队首。
步骤609:锁管理器根据当前时间和有效时间,确定目标线程的超时时间。
在实际实施时,当前时间加上有效时间即可得到目标线程的超时时间。
步骤610:锁管理器在目标远端队列中设置目标线程的超时时间。
在实际实施时,锁管理器将目标线程的有效时间修改为目标线程的超时时间。
步骤611:锁管理器通知目标线程。
这里,通知目标线程,以使目标线程能够获知其已经具有分布式锁权限,进而执行相应的处理。
步骤612:目标线程访问对应目标分布式锁的资源。
步骤613:目标线程发送针对目标分布式锁的锁释放请求。
这里,在完成对目标分布式锁的资源的访问后,目标线程可以主动请求释放分布式锁权限。
在另一些实施例中,当目标线程持有分布式锁权限超时、或目标线程因宕机等原因没有在超时前主动释放分布式锁权限时,分布式锁权限可以被自动释放,也即其他服务线程中的锁管理器在检测到目标线程持有分布式锁权限超时后,会在远端队列中将目标线程对应的锁获取信息删除,以使得其它线程能够获取到该分布式锁权限。
步骤614:锁管理器将目标线程的线程标识从目标本地队列中删除。
步骤615:锁管理器将目标线程的线程标识及对应的超时时间从目标远端队列中删除。
下面,将继续说明本发明实施例的分布式锁的实现方法。
首先,对本发明实施例提供的分布式锁的实现的整体技术方案进行介绍。图7为本发明实施例提供的分布式锁的实现系统的架构示意图,参见图7,本发明实施例的分布式锁的实现系统包括多个服务实例及KV数据库,每个服务实例中分别设置有一个锁管理器,用于管理本进程中所有分布式锁的获取及释放。当服务实例中的线程需要获取或释放分布式锁时,将锁获取请求或锁释放请求发送给锁管理器,由锁管理器负责连接远端KV数据库执行锁相关操作,并将结果反馈给对应的线程。
接下来对本发明实施例提供的分布式锁的实现方法进行具体介绍。图8为本发明实施例提供的分布式锁的实现方法的流程示意图,参见图8,本发明实施例的分布式锁的实现方法包括:
步骤701:目标线程提交针对分布式锁的锁获取请求。
其中,步骤701可以通过步骤7011至步骤7013实现,将结合各步骤进行说明。
步骤7011:目标线程发送针对分布式锁的锁获取请求至锁管理器。
步骤7012:锁管理器将锁获取请求对应的锁获取信息存储至本地队列。
这里,锁获取信息可以为对应目标线程的一个全局唯一的线程标识。在实际实施时,可以根据机器IP、进程号及线程号,生成该线程标识。
需要说明的是,本地队列可以为多个,分别对应不同的分布式锁,在实际实施时,锁管理器根据目标线程所请求的分布式锁,将锁获取信息存储至对应该分布式锁的本地队列的队尾。
步骤7013:锁管理器将锁获取请求对应的锁获取信息存储至远端队列。
相应的,远端队列也可以为多个,分别对应不同的分布式锁,在实际实施时,锁管理器根据目标线程所请求的分布式锁,将锁获取信息存储至对应该分布式锁的远端队列的队尾。
需要说明的是,锁管理器在将线程标识存储至对应分布式锁的远端队列的队尾时,会对应设置目标线程的有效时间。在实际实施时,有效时间携带在目标线程发送的锁获取请求中,锁管理器从锁获取请求中获取有效时间,然后将生成的线程标识与有效时间以键值对的形式添加至远端队列的队尾。
步骤702:目标线程获取分布式锁权限。
其中,步骤702可以通过步骤7021至步骤7023实现,将结合各步骤进行说明。
步骤7021:锁管理器检测目标线程对应的锁获取信息是否处于本地队列队首、且处于远端队列队首,若是,则执行步骤7022;若否,则执行步骤7023。
步骤7022:锁管理器设置目标线程的超时时间,并通知目标线程。
这里,设置目标线程的超时时间后,表征目标线程在超时时间之前具有分布式锁权限,通知目标线程,以使目标线程基于分布式锁权限,访问该分布式锁对应的资源。
在实际实施时,锁管理器根据当前时间与目标线程的有效时间,确定目标线程所对应的超时时间,即将有效时间加上当前时间,得到超时时间。
步骤7023:检测远端队列队首所对应的线程持有分布式锁权限是否超时,若是,则执行步骤7032;否则,执行步骤7021。
步骤703:目标线程释放分布式锁权限。
其中,步骤703可以通过步骤7031至步骤7032实现,将结合各步骤进行说明。
步骤7031:目标线程释放锁资源,删除远端队列及本地队列的队首的锁获取信息。
在一些实施例中,当目标线程访问分布式锁对应的资源,并执行相应操作后,可以主动释放分布式锁权限,以使其它线程能够获取该分布式锁权限。当目标线程需要主动释放分布式锁权限时,可以发送锁释放请求给锁管理器,锁管理器根据锁释放请求,进行对发送锁释放请求的线程验证,确定该线程为目标线程时,删除本地队列及远端队列中目标线程对应的锁获取信息。
在一些实施例中,当目标线程持有分布式锁权限超时、或目标线程因宕机等原因没有在超时前主动释放分布式锁权限时,分布式锁权限可以被自动释放,也即其他服务线程中的锁管理器在检测到目标线程持有分布式锁权限超时后,会在远端队列中将目标线程对应的锁获取信息删除,以使得其它线程能够获取到该分布式锁权限。
步骤7032:删除远端队列的队首的锁获取信息,然后,执行步骤7021。
下面将说明本发明实施例在一个实际的应用场景中的示例性应用。
图9为本发明实施例提供的分布式锁的实现系统的架构示意图,系统包含两个服务实例,即服务实例0和服务实例1,其中,服务实例0包含3个线程A、B、C,服务实例1中包含3个线程D、E、F。在这两个服务实例中,各自通过一个锁管理器对本服务实例中所有分布式锁的本地队列进行监管。远端KV数据库负责存储远端,如图中对应分布式锁-0和分布式锁-1两个远端队列,远端队列中每个成员记录了一个全局唯一的线程标识,及其对应的超时时间TTE或有效时间TTL。下面是更详细的流程介绍。
1、提交针对分布式锁的锁获取请求。
1)目标线程发送针对分布式锁的锁获取请求至锁管理器。
服务实例0和服务实例1中的各线程在需要获取分布式锁时,发送锁获取请求给锁管理器。其中,锁获取请求中至少包括分布式锁的锁名及有效时间。有效时间TTL用于保证当持有分布式锁权限超时时,该分布式锁权限能被自动释放。
2)锁管理器将取锁请求加入本地队列。
当锁管理器接收到锁获取请求后,根据机器IP、进程号、线程号等信息,为发送锁获取请求的线程生成一个全局唯一的线程标识,记为A、B…F,其作用是为了进行有序的分布式锁权限的分配,以及保证分布式锁权限的安全释放。然后,根据所要获取的分布式锁的锁名,将生成的线程标识存储至对应分布式锁的本地队列的队尾。如图9所示,“线程-A”请求获取的是“分布式锁-0”,那么将A存储至“分布式锁-0”对应的本地队列的队尾。
在实际实施时,本地队列的数目会根据锁获取请求的不同而动态变化。例如,当服务实例0中的线程-A发送针对分布式锁-0的锁获取请求时,锁管理器检测到分布式锁-0对应的本地队列不存在,则会为其创建一个本地队列,并将线程-A的线程标识A存至该本地队列。并且,锁管理器会从线程池中取出一个线程t0,用于监控分布式锁-0对应的本地队列及远端队列的状态。而当某个本地队列在一段时间内处于空闲状态,锁管理器则会将其回收,并将用于监控该本地队列的线程将被重新放回线程池中。
需要说明的是,若线程池中线程不够用时,可以创建新的线程并加入线程池中。这样既保证了动态的监控线程数目,也避免了反复的线程创建、销毁开销。
3)锁管理器将锁获取请求对应的锁获取信息存储至远端队列。
这里,锁管理器在将锁获取请求对应的锁获取信息存储至本地队列的同时,将其存储至KV数据库中的远端队列,并为其设定相应的有效时间,如此,能够保证本地队列与远端队列的存储顺序一致,从而避免因顺序不一致带来的死锁问题。
2、目标线程获取分布式锁权限。
这里,通过检测本地队列队首的线程标识是否处于远端队列队首,来确定本地队列队首的线程标识对应的线程是否能够获取分布式锁权限。也即,只有当目标线程的线程标识位于本地队列队首及远端队列队首时,才能确定目标线程具有分布式锁权限。
在实际实施时,可以通过对应各本地队列的线程来执行相应的检测操作。如图9所示,服务实例0中的线程t0用于检测服务实例0中分布式锁-0对应的本地队列队首的线程标识是否处于分布式锁-0对应的远端队列队首。
检测结果通常分为两种情形,图10A-10B为本发明实施例提供的分布式锁权限获取的示意图,参见图10A-10B,下面以图10A中服务实例0中的线程t0、图10B中服务实例1中的线程t0’为例,分别进行说明:
情形1、获得分布式锁权限:
参见图10A,服务实例0中的线程t0检测到线程标识A位于本地队列队首且位于远端队列队首,确定线程标识A所对应的线程获得了分布式锁-0的分布式锁权限。通过线程t0立即设置远端队列中线程标识A对应的超时时间TTE,超时时间TTE为当前时间加上有效时间TTL。然后,通过线程t0通知线程标识A所对应的线程A获取分布式锁-0成功,使其执行获得分布式锁权限之后的业务操作。
情形2、等待分布式锁权限:
参见图10B,服务实例1中的线程t0’检测到线程标识D位于本地队列队首但不位于远端队列队首,确定该分布式锁权限被其他线程占有,则线程t0’会检测远端队列队首的线程标识A的超时时间TTE。
若系统当前时间小于线程标识A的超时时间TTE,则表示线程A持有分布式锁权限未发生超时,那么,线程t0’需要进行重试,即循环检测线程标识D是否位于远端队列队首;
若系统当前时间大于或等于线程标识A的超时时间TTE,,则表示线程A持有分布式锁权限已发生超时,该分布式锁权限被视为自动释放,线程t0’可以直接将线程标识A从远端队列中删除,并重新检测线程标识D是否位于远端队列队首;
需要注意的是,通常在分布式系统中,会存在多个线程同时试图删除远端队列队首的线程标识的可能性,全局唯一的线程标识保证了只能删除该线程标识,而不会误删其他线程标识。执行删除远端队列队首的线程标识成功的线程,还要负责为新的远端队列队首的线程标识设置超时时间TTE,以避免新的远端队列队首的线程标识所对应的线程在出现异常时,由于始终占据远端队列队首的位置而导致的死锁问题。
3、目标线程释放分布式锁权限
如图10A所示,当前分布式锁-0的分布式锁权限被线程A持有,该分布式锁权限的释放通常有两种情况:主动释放和超时释放。
1)主动释放
大多数正常情况下,线程都会在分布式锁权限超时之前主动去释放分布式锁权限。此时,线程A同样只需将锁释放请求发送至锁管理器,由锁管理器通过线程t0立刻从远端队列中删除队首的线程标识A,即分布式锁权限被正常释放;然后线程t0再从本地队列中将线程标识A删除。随后,线程t0将开始为新的本地队列队首的线程标识C检测并获取分布式锁权限。
2)超时释放
当持有分布式锁权限的线程A处理超时、或者因宕机等原因,导致在超时时间TTE之前未主动释放分布式锁权限时,由于存在超时时间TTE的保障,当线程A持有分布式锁权限超时后,分布式锁权限将自动被释放,该线程标识A可被其他任意监控线程从远端队列中删除。
应用本发明上述实施例,至少具有以下有益效果:
1)通过设置本地队列及远端队列,实现了一种兼顾效率和公平的分布式锁,保证了分布式锁权限在分配过程中能优先分配给先发送锁获取请求的线程,避免了现有的基于Redis的分布式锁实现方法中存在的锁饥饿问题,保证在系统能够承受的压力范围内,分布式锁权限能够被有序分配和释放;
2)通过设置本地队列对一个服务实例中的多个请求分布式锁的线程进行排序,然后通过一个锁管理器对本服务实例中的分布式锁的本地队列进行监管及对远端KV数据库进行连接,以实现分布式锁的获取及释放;相对于由请求获取分布式锁的线程自主向远端发送获取请求的方式,本发明极大地减少了分布式锁竞争重试时带给KV存储组件的访问压力;
3)本发明实施例的分布式锁的实现方法简单,对远端存储系统限制宽松,常见的分布式KV数据库组件均可用作远端队列的存储,因此,可以作为一种简单高效的分布式锁的实现方法,被推广应用到所有分布式系统中。
下面继续说明本发明实施例提供的分布式锁的实现装置455的实施为软件模块的示例性结构,图11为本发明实施例提供的分布式锁的实现装置的组成结构示意图,参见图11,在一些实施例中,本发明实施例提供的分布式锁的实现装置包括:
确定模块4551,用于响应于目标线程发送的针对分布式锁的锁获取请求,确定所述目标线程对应的锁获取信息;
存储模块4552,用于将所述锁获取信息分别存储至本地队列及远端队列;
其中,所述本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;所述远端队列,用于存储对应全局服务实例的锁获取信息,所述远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致;
检测模块4553,用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限;
通知模块4554,用于通知所述目标线程,以使所述目标线程基于所述分布式锁的权限,访问所述分布式锁对应的资源。
在一些实施例中,所述确定模块4551,还用于基于所述锁获取请求,生成对应所述目标线程的线程标识;
所述存储模块4552,还用于将所述线程标识存储至对应所述分布式锁的本地队列的队尾,并将所述线程标识存储至对应所述分布式锁的远端队列的队尾。
在一些实施例中,所述确定模块4551,还用于解析所述锁获取请求,得到对应所述锁获取请求的机器网际协议地址IP、进程号及线程号;
基于所述机器IP、进程号及线程号,生成对应所述目标线程的线程标识。
在一些实施例中,所述存储模块4552,还用于检测到对应所述分布式锁的本地队列不存在时,创建对应所述分布式锁的本地队列;
将对应所述目标线程的线程标识存储至创建的对应所述分布式锁的本地队列的队尾。
在一些实施例中,所述装置还包括:
删除模块,用于确定所述本地队列在预设时长内处于空闲状态时,删除对应所述本地队列。
在一些实施例中,所述检测模块4553,还用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,在所述远端队列设置所述目标线程所对应的第一超时时间;
所述第一超时时间用于指示所述分布式锁权限的自动释放时间,表征在所述第一超时时间前所述目标线程具有所述分布式锁权限。
在一些实施例中,所述检测模块4553,还用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首,且不位于所述远端队列的队首时,将当前时间与位于所述远端队列的队首的锁获取信息所对应的第二超时时间进行比较;
当所述当前时间大于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限超时;
将位于所述远端队首的锁获取信息从所述远端队列中删除。
在一些实施例中,所述检测模块4553,还用于当所述当前时间小于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限未超时;
周期性检测所述目标线程对应的所述锁获取信息是否位于所述远端队列的队首。
在一些实施例中,所述删除模块,还用于接收到目标线程发送的针对分布式锁的锁释放请求;
删除所述本地队列及远端队列中所述目标线程对应的所述锁获取信息。
本发明实施例提供一种存储有可执行指令的存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本发明实施例提供的分布式锁的实现方法,例如,如图3示出的方法。
在一些实施例中,存储介质可以是FRAM、ROM、PROM、EPROM、EE PROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(H TML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
以上所述,仅为本发明的实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本发明的保护范围之内。
Claims (10)
1.一种分布式锁的实现方法,其特征在于,所述方法包括:
响应于目标线程发送的针对分布式锁的锁获取请求,确定所述目标线程对应的锁获取信息;
将所述锁获取信息分别存储至本地队列及远端队列;
其中,所述本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;所述远端队列,用于存储对应全局服务实例的锁获取信息,所述远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致;
检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限;
通知所述目标线程,以使所述目标线程基于所述分布式锁权限,访问所述分布式锁对应的资源。
2.如权利要求1所述的方法,其特征在于,所述确定所述目标线程对应的锁获取信息,包括:
基于所述锁获取请求,生成对应所述目标线程的线程标识;
相应的,所述将所述锁获取信息分别存储至本地队列及远端队列,包括:
将所述线程标识存储至对应所述分布式锁的本地队列的队尾,
并将所述线程标识存储至对应所述分布式锁的远端队列的队尾。
3.如权利要求2所述的方法,其特征在于,所述基于所述锁获取请求,生成对应所述目标线程的线程标识,包括:
解析所述锁获取请求,得到对应所述锁获取请求的机器网际协议地址IP、进程号及线程号;
基于所述机器IP、进程号及线程号,生成对应所述目标线程的线程标识。
4.如权利要求2所述的方法,其特征在于,所述将所述线程标识存储至对应所述分布式锁的本地队列的队尾,包括:
检测到对应所述分布式锁的本地队列不存在时,创建对应所述分布式锁的本地队列;
将对应所述目标线程的线程标识存储至创建的对应所述分布式锁的本地队列的队尾。
5.如权利要求1所述的方法,其特征在于,所述方法还包括:
确定所述本地队列在预设时长内处于空闲状态时,删除所述本地队列。
6.如权利要求1所述的方法,其特征在于,所述检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限,包括:
检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,在所述远端队列设置所述目标线程所对应的第一超时时间;
所述第一超时时间用于指示所述分布式锁权限的自动释放时间,表征在所述第一超时时间前所述目标线程具有所述分布式锁权限。
7.如权利要求1所述的方法,其特征在于,所述方法还包括:
检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首,且不位于所述远端队列的队首时,将当前时间与位于所述远端队列的队首的锁获取信息所对应的第二超时时间进行比较;
当所述当前时间大于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限超时;
将位于所述远端队首的锁获取信息从所述远端队列中删除。
8.如权利要求7所述的方法,其特征在于,所述方法还包括:
当所述当前时间小于所述第二超时时间时,确定位于所述远端队列队首的锁获取信息所对应的线程的所述分布式锁权限未超时;
周期性检测所述目标线程对应的所述锁获取信息是否位于所述远端队列的队首。
9.如权利要求1所述的方法,其特征在于,所述方法还包括:
接收到目标线程发送的针对分布式锁的锁释放请求;
删除所述本地队列及远端队列中所述目标线程对应的所述锁获取信息。
10.一种分布式锁的实现装置,其特征在于,所述装置包括:
确定模块,用于响应于目标线程发送的针对分布式锁的锁获取请求,确定所述目标线程对应的锁获取信息;
存储模块,用于将所述锁获取信息分别存储至本地队列及远端队列;
其中,所述本地队列,用于存储归属于同一服务实例的多个线程对应的锁获取信息;所述远端队列,用于存储对应全局服务实例的锁获取信息,所述远端队列中锁获取信息的存储顺序与相应线程的分布式锁权限的获取顺序相一致;
检测模块,用于检测到所述目标线程对应的所述锁获取信息位于所述本地队列的队首及所述远端队列的队首时,确定所述目标线程具有所述分布式锁权限;
通知模块,用于通知所述目标线程,以使所述目标线程基于所述分布式锁的权限,访问所述分布式锁对应的资源。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911255781.8A CN110971700B (zh) | 2019-12-10 | 2019-12-10 | 分布式锁的实现方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911255781.8A CN110971700B (zh) | 2019-12-10 | 2019-12-10 | 分布式锁的实现方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110971700A true CN110971700A (zh) | 2020-04-07 |
CN110971700B CN110971700B (zh) | 2023-07-21 |
Family
ID=70033533
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911255781.8A Active CN110971700B (zh) | 2019-12-10 | 2019-12-10 | 分布式锁的实现方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110971700B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111708643A (zh) * | 2020-06-11 | 2020-09-25 | 中国工商银行股份有限公司 | 分布式流媒体平台的批量作业方法及装置 |
CN112099962A (zh) * | 2020-11-06 | 2020-12-18 | 成都新希望金融信息有限公司 | 分布式锁实现方法、装置和电子设备 |
CN112835722A (zh) * | 2021-01-29 | 2021-05-25 | 卓望数码技术(深圳)有限公司 | 业务处理方法、电子设备及计算机可读存储介质 |
CN114567540A (zh) * | 2022-02-25 | 2022-05-31 | 北京百度网讯科技有限公司 | 主备节点切换方法、装置、设备、介质及程序产品 |
CN115866039A (zh) * | 2022-11-29 | 2023-03-28 | 北京达佳互联信息技术有限公司 | 消息处理方法、装置、电子设备及存储介质 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030195920A1 (en) * | 2000-05-25 | 2003-10-16 | Brenner Larry Bert | Apparatus and method for minimizing lock contention in a multiple processor system with multiple run queues |
US20040002974A1 (en) * | 2002-06-27 | 2004-01-01 | Intel Corporation | Thread based lock manager |
US20100114849A1 (en) * | 2008-10-30 | 2010-05-06 | Kingsbury Brent A | Allocating Priorities to Prevent Deadlocks in a Storage System |
US20100242043A1 (en) * | 2009-03-18 | 2010-09-23 | Charles Scott Shorb | Computer-Implemented Systems For Resource Level Locking Without Resource Level Locks |
US7945912B1 (en) * | 2006-06-02 | 2011-05-17 | Oracle America, Inc. | Hierarchical queue-based locks |
US20120089735A1 (en) * | 2010-10-11 | 2012-04-12 | International Business Machines Corporation | Two-Level Management of Locks on Shared Resources |
US20120311606A1 (en) * | 2011-06-02 | 2012-12-06 | Marathe Virendra J | System and Method for Implementing Hierarchical Queue-Based Locks Using Flat Combining |
CN109450979A (zh) * | 2018-10-10 | 2019-03-08 | 广州华多网络科技有限公司 | 一种分布式动态任务执行方法及主服务节点端 |
CN109495528A (zh) * | 2017-09-12 | 2019-03-19 | 阿里巴巴集团控股有限公司 | 分布式锁所有权调度方法和装置 |
CN110188110A (zh) * | 2019-05-30 | 2019-08-30 | 深圳前海微众银行股份有限公司 | 一种构建分布式锁的方法及装置 |
-
2019
- 2019-12-10 CN CN201911255781.8A patent/CN110971700B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030195920A1 (en) * | 2000-05-25 | 2003-10-16 | Brenner Larry Bert | Apparatus and method for minimizing lock contention in a multiple processor system with multiple run queues |
US20040002974A1 (en) * | 2002-06-27 | 2004-01-01 | Intel Corporation | Thread based lock manager |
US7945912B1 (en) * | 2006-06-02 | 2011-05-17 | Oracle America, Inc. | Hierarchical queue-based locks |
US20100114849A1 (en) * | 2008-10-30 | 2010-05-06 | Kingsbury Brent A | Allocating Priorities to Prevent Deadlocks in a Storage System |
US20100242043A1 (en) * | 2009-03-18 | 2010-09-23 | Charles Scott Shorb | Computer-Implemented Systems For Resource Level Locking Without Resource Level Locks |
US20120089735A1 (en) * | 2010-10-11 | 2012-04-12 | International Business Machines Corporation | Two-Level Management of Locks on Shared Resources |
US20120311606A1 (en) * | 2011-06-02 | 2012-12-06 | Marathe Virendra J | System and Method for Implementing Hierarchical Queue-Based Locks Using Flat Combining |
US8458721B2 (en) * | 2011-06-02 | 2013-06-04 | Oracle International Corporation | System and method for implementing hierarchical queue-based locks using flat combining |
CN109495528A (zh) * | 2017-09-12 | 2019-03-19 | 阿里巴巴集团控股有限公司 | 分布式锁所有权调度方法和装置 |
CN109450979A (zh) * | 2018-10-10 | 2019-03-08 | 广州华多网络科技有限公司 | 一种分布式动态任务执行方法及主服务节点端 |
CN110188110A (zh) * | 2019-05-30 | 2019-08-30 | 深圳前海微众银行股份有限公司 | 一种构建分布式锁的方法及装置 |
Non-Patent Citations (1)
Title |
---|
A. DEVULAPALLI等: ""Distributed Queue-based Locking using Advanced Network Features"", 《2005 INTERNATIONAL CONFERENCE ON PARALLEL PROCESSING》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111708643A (zh) * | 2020-06-11 | 2020-09-25 | 中国工商银行股份有限公司 | 分布式流媒体平台的批量作业方法及装置 |
CN112099962A (zh) * | 2020-11-06 | 2020-12-18 | 成都新希望金融信息有限公司 | 分布式锁实现方法、装置和电子设备 |
CN112099962B (zh) * | 2020-11-06 | 2021-02-19 | 成都新希望金融信息有限公司 | 分布式锁实现方法、装置和电子设备 |
CN112835722A (zh) * | 2021-01-29 | 2021-05-25 | 卓望数码技术(深圳)有限公司 | 业务处理方法、电子设备及计算机可读存储介质 |
CN112835722B (zh) * | 2021-01-29 | 2024-04-26 | 卓望数码技术(深圳)有限公司 | 业务处理方法、电子设备及计算机可读存储介质 |
CN114567540A (zh) * | 2022-02-25 | 2022-05-31 | 北京百度网讯科技有限公司 | 主备节点切换方法、装置、设备、介质及程序产品 |
CN115866039A (zh) * | 2022-11-29 | 2023-03-28 | 北京达佳互联信息技术有限公司 | 消息处理方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110971700B (zh) | 2023-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11593149B2 (en) | Unified resource management for containers and virtual machines | |
CN110971700B (zh) | 分布式锁的实现方法及装置 | |
CN109120678B (zh) | 用于分布式存储系统的服务托管的方法和装置 | |
US11226847B2 (en) | Implementing an application manifest in a node-specific manner using an intent-based orchestrator | |
US9684502B2 (en) | Apparatus, systems, and methods for distributed application orchestration and deployment | |
US10142174B2 (en) | Service deployment infrastructure request provisioning | |
US10481821B2 (en) | Replication protocol with consensus for a decentralized control plane in a computer system | |
US20180322162A1 (en) | Query dispatch and execution architecture | |
US9501541B2 (en) | Separation of pod provisioning and service provisioning | |
US11061884B2 (en) | Method and system to accelerate transaction commit using non-volatile memory | |
US11119829B2 (en) | On-demand provisioning of customized developer environments | |
US20120102506A1 (en) | Web service patterns for globally distributed service fabric | |
US11115348B2 (en) | Virtual resource allocation for processing an event queue | |
EP2893683A1 (en) | Ldap-based multi-customer in-cloud identity management system | |
US9542226B2 (en) | Operating programs on a computer cluster | |
US10305817B1 (en) | Provisioning system and method for a distributed computing environment using a map reduce process | |
US11042409B2 (en) | Leader election with lifetime term | |
US20140337750A1 (en) | Dynamically grouping monitored resources in a cloud environment to collections representing a composite application | |
CN113886089A (zh) | 一种任务处理方法、装置、系统、设备及介质 | |
CN111666134A (zh) | 一种分布式任务调度的方法和系统 | |
US9805038B2 (en) | Efficient conflict resolution among stateless processes | |
CN110494849B (zh) | 用于确定跨平台应用迁移的成功的系统和方法 | |
CN117076096A (zh) | 任务流程的执行方法、装置、计算机可读介质及电子设备 | |
US8353013B2 (en) | Authorized application services via an XML message protocol | |
US10691558B1 (en) | Fault tolerant data export using snapshots |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40021516 Country of ref document: HK |
|
GR01 | Patent grant | ||
GR01 | Patent grant |