一种分布式锁实现方法及装置与流程

文档序号:11263707阅读:137来源:国知局
一种分布式锁实现方法及装置与流程

本发明涉及计算机技术领域,特别是涉及一种分布式锁实现方法及装置。



背景技术:

在大数据处理系统中,单进程或单机系统内,当需要并行处理一些任务时,常常会出现多线程或多进程并发访问某个数据变量,通常将该数据变量称为临界资源,这时可通过线程或进程之间的互斥同步机制,对资源进行加锁,以保障资源的完整性和一致性。单机的进程同步和线程同步有很多可用的方法,比如互斥锁、信号量、条件变量等。

在分布式系统中,情况就完全不同,由于分布式系统中,每个组件都是运行在不同的机器上,不在统一的运行环境中,单机下的互斥方案在多机上是无法使用的。分布式环境下,常常通过分布式锁实现对临界资源的互斥访问,比如,使用分布式锁服务googlechubby以及开源分布式处理系统zookeeper,实现对临界资源的互斥访问形成的分布式锁。具体实现方式为:首先,不同的客户端发起加锁操作请求给服务器端,服务器收到多个加锁操作请求后,对一个分布式锁的所有客户端请求进行递增编号,服务器将一个分布式锁下面的所有加锁操作请求编号和客户端对应的加锁操作请求返回给客户端。客户端收到所有加锁操作请求编号后,按照加锁操作请求编号的大小进行排序,如果最小的加锁操作请求编号和自身加锁操作请求编号一致的话,即表明成功获取了该分布式锁,可进行后续的操作。如果最小请求编号不是自身加锁操作请求编号,就需要等待,直到有其他客户端释放了该分布式锁,并通知所有等待该分布式锁的客户端进行重新获取加锁操作请求编号排序。

现有的分布式锁实现方式中,涉及大量网络通信,客户端需要获取服务器分配给所有其他客户端的加锁操作请求编号,并在所有客户端的本地进行排序,这不但有大量的冗余数据传输,也需要进行不必要的重复排序。对系统处理任务的性能提升以及可扩展性都有很大影响。



技术实现要素:

本发明实施例的目的在于提供一种分布式锁实现方法及装置,在服务器端利用队列的方式,将分布式锁按照至少一个客户端加锁操作请求先后顺序分配给至少一个客户端,减少了冗余数据传输以及不必要的重复排序,对系统处理任务的性能以及可扩展性有大提升。

为达到上述发明目的,本发明实施例公开了一种分布式锁实现方法,应用于服务器端,包括:

获取当前分布式锁下的至少一个客户端的加锁操作请求,将所述至少一个客户端的所述加锁操作请求对应的所述至少一个客户端,加入到所述当前分布式锁的客户端队列;

根据所述客户端队列的顺序,当所述至少一个客户端中的第一客户端、更新处于所述客户端队列中的第一次序时,将所述当前分布式锁分配给所述第一客户端,其中,所述客户端队列包括所述当前分布式锁下的所述至少一个客户端,所述第一客户端为所述至少一个客户端中的任一客户端;

当所述第一客户端使用完成所述当前分布式锁的资源后,获取所述第一客户端的当前分布式锁未占用信息,将所述客户端队列中的所述第一客户端删除;

根据所述客户端队列的顺序,当所述至少一个客户端中除所述第一客户端以外的客户端、更新处于所述客户端队列中的第一次序时,将所述当前分布式锁分配给所述客户端队列中的第一次序的、所述至少一个客户端中除所述第一客户端以外的客户端。

可选地,所述获取当前分布式锁下的至少一个客户端的加锁操作请求,将所述至少一个客户端的所述加锁操作请求对应的所述至少一个客户端,加入到所述当前分布式锁的客户端队列,包括:

获取所述当前分布式锁下的所述至少一个客户端发送的所述加锁操作请求;

当所述客户端队列未满时,按照所述至少一个客户端发送的所述加锁操作请求的时间顺序,将所述至少一个客户端加入到所述客户端队列;

当所述客户端队列已满时,等待处于所述客户端队列中的第一次序的客户端使用完成所述当前分布式锁后,删除处于所述客户端队列中的第一次序的客户端,按照所述至少一个客户端发送的所述加锁操作请求的时间顺序,将所述至少一个客户端中的一个客户端加入到所述客户端队列。

可选地,在根据所述客户端队列的顺序,当所述至少一个客户端中的第一客户端、更新处于所述客户端队列中的第一次序时,将所述当前分布式锁分配给所述第一客户端之后,所述方法还包括:

发送当前分布式锁已占用信息,到所述当前分布式锁下的所述至少一个客户端中除所述第一客户端以外的客户端。

为达到上述发明目的,本发明实施例还公开了一种分布式锁实现方法,应用于至少一个客户端,所述至少一个客户端包括第一客户端,包括:

当前分布式锁下的所述至少一个客户端中的所述第一客户端,发送加锁操作请求到服务器,其中,所述第一客户端为所述至少一个客户端的任一客户端;

根据所述服务器的客户端队列的顺序,当所述第一客户端、更新处于所述客户端队列中的第一次序时,所述当前分布式锁下的所述第一客户端获取所述当前分布式锁,所述第一客户端对所述当前分布式锁的资源加锁,并根据所述当前分布式锁的所述资源执行相应的操作;

当所述第一客户端使用完成所述当前分布式锁的所述资源后,所述第一客户端对所述当前分布式锁的所述资源执行解锁操作,将所述当前分布式锁的所述资源释放,并发送当前分布式锁未占用信息到所述服务器;或

根据所述服务器的所述客户端队列的顺序,当所述第一客户端未处于所述客户端队列中的第一次序时,等待所述当前分布式锁的分配。

可选地,所述根据所述服务器的所述客户端队列的顺序,当所述第一客户端未处于所述客户端队列中的第一次序时,等待所述当前分布式锁的分配,所述方法包括:

根据所述服务器的所述客户端队列的顺序,当所述第一客户端未处于所述客户端队列中的第一次序时,所述第一客户端接收所述服务器发送的当前分布式锁已占用信息,等待所述当前分布式锁的分配。

为达到上述发明目的,本发明实施例公开了一种分布式锁实现装置,应用于服务器端,包括:

入队模块,用于获取当前分布式锁下的至少一个客户端的加锁操作请求,将所述至少一个客户端的所述加锁操作请求对应的所述至少一个客户端,加入到所述当前分布式锁的客户端队列;

第一分配模块,用于根据所述客户端队列的顺序,当所述至少一个客户端中的第一客户端、更新处于所述客户端队列中的第一次序时,将所述当前分布式锁分配给所述第一客户端,其中,所述客户端队列包括所述当前分布式锁下的所述至少一个客户端,所述第一客户端为所述至少一个客户端中的任一客户端;

删除模块,用于当所述第一客户端使用完成所述当前分布式锁的资源后,获取所述第一客户端的当前分布式锁未占用信息,将所述客户端队列中的所述第一客户端删除;

第二分配模块,用于根据所述客户端队列的顺序,当所述至少一个客户端中除所述第一客户端以外的客户端、更新处于所述客户端队列中的第一次序时,将所述当前分布式锁分配给所述客户端队列中的第一次序的、所述至少一个客户端中除所述第一客户端以外的客户端。

可选地,所述入队模块,包括:

获取请求子模块,用于获取所述当前分布式锁下的所述至少一个客户端发送的所述加锁操作请求;

第一入队子模块,用于当所述客户端队列未满时,按照所述至少一个客户端发送的所述加锁操作请求的时间顺序,将所述至少一个客户端加入到所述客户端队列;

第二入队子模块,用于当所述客户端队列已满时,等待处于所述客户端队列中的第一次序的客户端使用完成所述当前分布式锁,删除处于所述客户端队列中的第一次序的客户端,按照所述至少一个客户端发送的所述加锁操作请求的时间顺序,将所述至少一个客户端中的一个客户端加入到所述客户端队列。

可选地,所述装置还包括:

信息发送模块,用于发送当前分布式锁已占用信息,到所述当前分布式锁下的所述至少一个客户端中除所述第一客户端以外的客户端。

为达到上述发明目的,本发明实施例还公开了一种分布式锁实现装置,应用于至少一个客户端,所述至少一个客户端包括第一客户端,包括:

信息发送模块,用于当前分布式锁下的所述至少一个客户端中的所述第一客户端,发送加锁操作请求到服务器,其中,所述第一客户端为所述至少一个客户端的任一客户端;

获取锁模块,用于根据所述服务器的客户端队列的顺序,当所述第一客户端、更新处于所述客户端队列中的第一次序时,所述当前分布式锁下的所述第一客户端获取所述当前分布式锁,所述第一客户端对所述当前分布式锁的资源加锁,并根据所述当前分布式锁的所述资源执行相应的操作;

解锁模块,用于当所述第一客户端使用完成所述当前分布式锁的所述资源后,所述第一客户端对所述当前分布式锁的所述资源执行解锁操作,将所述当前分布式锁的所述资源释放,并发送当前分布式锁未占用信息到所述服务器;或

等待模块,用于根据所述服务器的所述客户端队列的顺序,当所述第一客户端未处于所述客户端队列中的第一次序时,等待所述当前分布式锁的分配。

可选地,所述等待模块,具体用于,根据所述服务器的所述客户端队列的顺序,当所述第一客户端未处于所述客户端队列中的第一次序时,所述第一客户端接收所述服务器发送的当前分布式锁已占用信息,等待所述当前分布式锁的分配。

本发明实施例公开了一种分布式锁实现方法及装置,在服务器端利用队列先进先出的思想,无须将某个分布式锁下面的至少一个客户端找到并返回给所有客户端。所有的排序均在服务端完成,而且通过队列的数据结构,能保证按照先后有序存放,节省了现有技术每次需要在客户端排序的开销。至少一个客户端按照服务器端的队列顺序获取分布式锁的资源,并且对于每个客户端对获得的分布式锁的资源加锁和解锁的操作均为o(1),操作效率高。本发明实施例的一种分布式锁实现方法,不需要大量数据在客户端和服务端传递,也无须在客户端对大量数据排序,减少了冗余数据传输以及不必要的重复排序,对系统处理数据的性能以及可扩展性有大提升。当然,实施本发明的任一产品或方法必不一定需要同时达到以上所述的所有优点。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例的一种分布式锁实现方法应用于服务器端的流程图;

图2为本发明实施例的一种分布式锁实现方法应用于客户端的流程图;

图3为本发明实施例的一种分布式锁实现方法服务器端与客户端交互关系图;

图4为本发明实施例的一种分布式锁实现装置应用于服务器端的装置图;

图5为本发明实施例的一种分布式锁实现装置应用于客户端的装置图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

以下通过具体实施例,对本发明进行详细说明。

为达到上述发明目的,本发明实施例公开了一种分布式锁实现方法,应用于服务器端,如图1所示。图1为本发明实施例的一种分布式锁实现方法应用于服务器端的流程图,包括:

s101,获取当前分布式锁下的至少一个客户端的加锁操作请求,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁的客户端队列。

具体地,在分布式系统中,多线程或多进程并发访问某个数据变量时,经常涉及到对资源的互斥访问。互斥访问允许在同一时刻可以有多线程或多进程同时访问同一资源。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。分布式锁是控制分布式系统之间同步访问共享资源的一种方式。

在本发明实施例中,在服务器端利用数据结构建立队列,该队列是按照每一个分布式锁下需要获取该分布式锁的至少一个客户端发送的加锁操作请求顺序形成的。在本发明实施例中将需要获取该分布式锁的至少一个客户端发送的请求定义为加锁操作请求,将按照发送的加锁操作请求顺序对应的至少一个客户端形成的队列定义为客户端队列。

具体在实时分布式任务处理过程中,根据获取当前分布式锁下的至少一个客户端的加锁操作请求顺序,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁的客户端队列。

s102,根据客户端队列的顺序,当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,将当前分布式锁分配给第一客户端,其中,客户端队列包括当前分布式锁下的至少一个客户端,第一客户端为至少一个客户端中的任一客户端。

具体地,在实时分布式任务处理过程中,当前分布式锁总是按照客户端队列的顺序,分配给处于客户端队列中的第一次序的客户端。在本发明实施例中,将需要获取该分布式锁的至少一个客户端中任一客户端定义为第一客户端。在该第一客户端加入到该客户端队列中后,当该第一客户端、更新处于客户端队列中的第一次序时,将当前分布式锁分配给该第一客户端。该第一客户端在获得到该分布式锁后,对该分布式锁的资源进行加锁操作,该第一客户端利用该分布式锁的资源执行相应的操作。该当前分布式锁下的至少一个客户端中除第一客户端以外的客户端,等待该当前分布式锁的分配。

s103,当第一客户端使用完成当前分布式锁的资源后,获取第一客户端的当前分布式锁未占用信息,将客户端队列中的第一客户端删除。

具体地,在实时分布式任务处理过程中,该当前分布式锁分配给该第一客户端后,该第一客户端利用该分布式锁的资源完成相应的操作后,该第一客户端会将该当前分布式锁的资源解锁,释放该当前分布式锁的资源,让其他等待利用该当前分布式锁的资源的客户端获取该当前分布式锁。

具体执行过程为,该第一客户端利用该当前分布式锁的资源执行完成操作后,将该当前分布式锁的资源解锁,进而向服务器端发送该当前分布式锁未占用信息。该服务器接收到该第一客户端发送的当前分布式锁未占用信息后,将该第一客户端从客户端队列中的第一次序删除,将后续的客户端在该客户端队列的位置向前移动一位,更新后续所有的客户端顺序。

s104,根据客户端队列的顺序,当至少一个客户端中除第一客户端以外的客户端、更新处于客户端队列中的第一次序处时,将当前分布式锁分配给客户端队列中的第一次序的、至少一个客户端中除第一客户端以外的客户端。

具体地,在实时分布式任务处理过程中,当前分布式锁总是按照客户端队列的顺序,分配给处于客户端队列中的第一次序的客户端。在该第一客户端从该客户端队列的第一次序处删除后,新的客户端更新到该客户端队列的第一次序处时,该当前分布式锁分配给该客户端队列的第一次序的客户端。该客户端使用完该当前分布式锁的资源后,将该当前分布式锁解锁。服务器将该当前分布式锁解锁的资源再分配给新的该客户端队列的第一次序处的客户端,按照这样的方式,依次将当前分布式锁分配给客户端队列中的第一次序的、至少一个客户端中除第一客户端以外的客户端,实现分布式锁的实时资源分配。

本发明实施例公开了一种分布式锁实现方法,在服务器端利用队列先进先出的思想,无须将某个分布式锁下面的至少一个客户端找到并返回给所有客户端。所有的排序均在服务端完成,而且通过队列的数据结构,能保证按照先后有序存放,节省了现有技术每次需要在客户端排序的开销。本发明实施例的一种分布式锁实现方法,不需要大量数据在客户端和服务端传递,也无须再客户端对大量数据排序,减少了冗余数据传输以及不必要的重复排序,对系统处理数据的性能以及可扩展性有大提升。

可选地,在本发明实施例的分布式锁实现方法的一种实施例中,获取当前分布式锁下的至少一个客户端的加锁操作请求,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁的客户端队列,包括:

步骤一,获取当前分布式锁下的至少一个客户端发送的加锁操作请求。

步骤二,当客户端队列未满时,按照至少一个客户端发送的加锁操作请求的时间顺序,将至少一个客户端加入到客户端队列。或者

具体地,在实时分布式任务处理过程中,服务器获取到当前分布式锁下的至少一个客户端发送的加锁操作请求,当该分布式锁的客户端队列未满时,将按照至少一个客户端互斥访问该服务器获取该当前分布式锁发送的加锁操作请求的时间先后顺序,将至少一个客户端加入到客户端队列加入到该分布式锁下的客户端队列中。如果在某一时间点,某两个客户端发送的加锁操作请求同时到达服务器时,可将两个客户端随机排序加入到该客户端队列中,当然这种情况发生的概率也是非常小的。该客户端队列的长度可由开发者根据实际访问该服务器获取该当前分布式锁的至少一个客户端的历史数目来定,或者可设置任一长度。

具体实施过程为:当该客户端队列的剩余空缺长度大于或等于至少一个客户端数目时,按照该至少一个客户端发送的加锁操作请求的时间先后顺序,将至少一个客户端全部加入到该当前分布式锁下的客户端队列;当该客户端队列的剩余空缺长度小于至少一个客户端数目时,按照该至少一个客户端发送的加锁操作请求的时间先后顺序,将至少一个客户端中该客户端队列的剩余空缺长度数目的客户端,加入到该当前分布式锁下的客户端队列中,至少一个客户端中除该客户端队列的剩余空缺长度数目的客户端以外、剩余的客户端等待加入到该客户端队列。或者

当客户端队列已满时,等待处于客户端队列中的第一次序的客户端使用完成当前分布式锁后,删除处于客户端队列中的第一次序的客户端,按照至少一个客户端发送的加锁操作请求的时间顺序,将至少一个客户端中的一个客户端加入到客户端队列。

具体地,在实时分布式任务处理过程中,服务器获取到当前分布式锁下的至少一个客户端发送的加锁操作请求,当该分布式锁的客户端队列已满时,等待处于该客户端队列中的第一次序处的客户端使用完成该当前分布式锁后,处于该客户端队列中的第一次序的客户端释放该当前分布式锁的资源后,服务器将处于该客户端队列中的第一次序的客户端从该客户端队列删除后,在该客户端队列中的第一次序后的所有客户端向前移动一位,空缺出该客户端队列中的最后次序位置,按照至少一个客户端发送的加锁操作请求的时间顺序,将至少一个客户端中的一个客户端加入到客户端队列中,剩余客户端按照上述方式类推,依次加入到该当前分布式锁的客户端队列中。

可见,通过获取当前分布式锁下的至少一个客户端的加锁操作请求,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁的客户端队列,可实现在服务器端建立一个有序队列,将当前分布式锁的资源按照该有序队列依次分配给至少一个客户端使用,不需要大量数据在客户端和服务端传递,也无须在客户端对大量数据排序,减少了冗余数据传输以及不必要的重复排序,提高系统整体效率。

需要说明的是,在服务器端具有符合数据结构先进先出思想的任一种实现方法,都属于本发明实施例的保护范围。

可选地,在本发明实施例的分布式锁实现方法的一种实施例中,在根据客户端队列的顺序,当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,将当前分布式锁分配给第一客户端之后,方法还包括:

发送当前分布式锁已占用信息,到当前分布式锁下的至少一个客户端除中除第一客户端以外的客户端。

具体地,在实时分布式任务处理过程中,当前分布式锁分配给更新处于该客户端队列中的第一次序的客户端时,该服务器可生成发送给该分布式锁下至少一个客户端除第一客户端以外的客户端的信息,在本发明实施例中定义为当前分布式锁已占用信息,该当前分布式锁已占用信息用于服务器告知客户端该当前分布式锁已被该第一客户端占用。

可见,通过客户端队列的顺序,当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,将当前分布式锁分配给第一客户端之后,发送当前分布式锁已占用信息,到当前分布式锁下的至少一个客户端除中除第一客户端以外的客户端,可实现服务器端与客户端更好的交互,通知客户端执行其他操作,避免所有客户端在等待该当前分布式锁形成死锁。

为达到上述发明目的,本发明实施例还公开了一种分布式锁实现方法,应用于至少一个客户端,如图2所示。图2为本发明实施例的一种分布式锁实现方法应用于至少一个客户端的流程图,包括:

s201,当前分布式锁下的至少一个客户端中的第一客户端,发送加锁操作请求到服务器,其中,第一客户端为至少一个客户端的任一客户端。

具体地,在实时分布式任务处理过程中,在同一时间段至少一个客户端发送获取服务器端的分布式锁的资源。在本发明实施例中,将需要获取当前分布式锁的资源的至少一个客户端中的任一客户端定义为第一客户端。从客户端的角度来说,本发明实施例的第一客户端发送获取该服务器分布式锁的加锁操作请求。

s202,根据服务器的客户端队列的顺序,当第一客户端、更新处于客户端队列中的第一次序时,当前分布式锁下的第一客户端获取当前分布式锁,第一客户端对当前分布式锁的资源加锁,并根据当前分布式锁的资源执行相应的操作。

具体地,在本发明实施例中,在服务器端利用数据结构建立队列,该队列是按照每一个分布式锁下需要获取该分布式锁的至少一个客户端发送的请求顺序形成的。在本发明实施例中将需要获取该分布式锁的至少一个客户端发送的请求定义为加锁操作请求,将按照发送的加锁操作请求顺序,对应的至少一个客户端形成的队列定义为客户端队列。

在具体实施过程中,服务器获取到在同一时间段至少一个客户端发送获取服务器端的分布式锁的资源的加锁操作请求。服务器根据获取的加锁操作请求顺序,在服务器端形成客户端队列。根据服务器端的该当前分布式锁的该客户端队列顺序,若此时该第一客户端处于该当前分布式锁的该客户端队列的第一顺序时,该服务器把该当前分布式锁分配给该第一客户端,该第一客户端获取当前分布式锁,并对该分布式锁的资源执行加锁操作,利用该分布式锁的资源执行相应的操作。

该分布式锁下的至少一个客户端除第一客户端以外的需要获取该分布式锁的其它客户端,等待该第一客户端将该分布式锁的资源释放,按照该客户端队列顺序,有序的获得该分布式锁的资源,执行相应的操作。

s203,当第一客户端使用完成当前分布式锁的资源后,第一客户端对当前分布式锁的资源执行解锁操作,将当前分布式锁的资源释放,并发送当前分布式锁未占用信息到服务器;或

具体地,在该第一客户端获得到该分布式锁的资源,执行完成操作后,该第一客户端将该分布式锁的资源解锁,释放出该分布式锁的资源,并且该第一客户端生成当前分布式锁未占用信息,将该分布式锁未占用信息发送给该服务器端,服务器将该分布式锁分配给其他处于该客户端队列中的第一次序的客户端,该客户端通过对该分布式锁的资源加锁操作,独占获取到该分布式锁的资源执行相应的操作。按照这种方式,让该分布式锁下的每个客户端都能有序的获得到该分布式锁的资源,从而执行相应的操作。

s204,根据服务器的客户端队列的顺序,当第一客户端未处于客户端队列中的第一次序时,等待当前分布式锁的分配。

具体地,根据服务器端的该当前分布式锁的该客户端队列顺序,若此时该第一客户端未处于该当前分布式锁的该客户端队列的第一顺序时,则该第一客户端需要等到该客户端队列在该第一客户端之前的所有客户端,利用该分布式锁的资源执行相应的操作后,将该分布式锁释放,并从该客户端队列中删除,到该第一客户端自身处于该客户端队列的第一次序时,才能获得该分布式锁,执行相应的操作。

本发明实施例公开了一种分布式锁实现方法,客户端按照在服务器端的客户端队列的顺序获得到该分布式锁的资源,所有的排序均在服务端完成,而且通过队列的数据结构,能保证按照先后有序存放,节省了现有技术每次需要在客户端排序的开销。并且对于每个客户端对获得的分布式锁的资源加锁和解锁的操作均为o(1),操作效率高。本发明实施例的一种分布式锁实现方法,不需要大量数据在客户端和服务端传递,也无须再客户端对大量数据排序,减少了冗余数据传输以及不必要的重复排序,对系统处理数据的性能以及可扩展性有大提升。

可选地,在本发明实施例的分布式锁实现方法的一种实施例中,根据服务器的客户端队列的顺序,当第一客户端未处于客户端队列中的第一次序时,等待当前分布式锁的分配,方法包括:

根据服务器的客户端队列的顺序,当第一客户端未处于客户端队列中的第一次序时,第一客户端接收服务器发送的当前分布式锁已占用信息,等待当前分布式锁的分配。

具体地,客户端获取给当前分布式锁执行操作时,按照服务器端的客户端队列顺序,那个客户端处于该客户端队列的第一次序,那个客户端获得该服务器的该当前分布式锁。

在实时分布式任务处理过程中,该第一客户端未处于客户端队列中的第一次序时,处于该客户端队列第一次序的当前客户端获得该服务器的该分布式锁的资源。该服务器发送该当前分布式锁已占用信息到当前分布式锁下的至少一个客户端,也包括该第一客户端。该第一客户端接收该当前分布式锁已占用信息,将会阻塞后续的客户端给该服务器发送加锁请求信息,避免死锁。按照服务器端的客户端队列顺序,当该第一客户端之前的所有客户端获得该分布式锁执行完成从该客户端队列删除后,当该第一客户端处于该客户端队列的第一次序时,该服务器将该当前分布式锁分配给该第一客户端。

可见,通过客户端接收服务器端发送的当前分布式锁已占用信息,可实现服务器与客户端更好的交互,以及客户端接收该当前分布式锁已占用信息,阻塞后续的客户端给该服务器发送加锁请求信息,避免死锁,增强了系统有序处理分布式任务的能力。

本发明实施例的分布式锁实现方法的一种实施例中,如图3所示,图3为本发明实施例的一种分布式锁实现方法服务器端与客户端交互关系图。具体为:

在图3中,可建立三组当前分布式锁的互斥访问的服务器端与客户端交互关系图。其中,在当前分布式锁1下,建立互斥访问当前分布式锁1的客户端a1、客户端a2、客户端a3形成的客户端队列,客户端a4为与当前分布式锁1连接的访问该当前分布式锁1,尚未加入到该当前分布式锁1的客户端队列的客户端。在当前分布式锁2下,建立互斥访问当前分布式锁2的客户端b1、客户端b2、客户端b3形成的客户端队列,客户端b4为与当前分布式锁2连接的访问该当前分布式锁2,尚未加入到该当前分布式锁2的客户端队列的客户端。在当前分布式锁3下,建立互斥访问当前分布式锁1的客户端c1、客户端c2、客户端c3形成的客户端队列,客户端c4为与当前分布式锁3连接的访问该当前分布式锁3,尚未加入到该当前分布式锁3的客户端队列的客户端。

具体来说,当客户端需要获取当前分布式锁,试图对该分布式锁的资源加锁的时候,往往要在分布式锁系统中创建一个抽象的数据对象表示要加锁的当前分布式锁的资源,比如,在开源分布式处理系统zookeeper中用一个znode表示要加锁的当前分布式锁,当客户端执行加锁操作时,要在znode下创建一系列的临时节点。本发明实施例使用一个lock对象表示要获取的当前分布式锁,同时,使用一个当前分布式锁的客户端队列lockqueue,用于存储所有想要获得该当前分布式锁的客户端编号,并有序排放,根据先进先出的思想,服务器收到的第一个客户端发送的加锁操作请求,则该加锁操作请求对应的客户端处于该当前分布式锁的客户端队列的第一次序,该客户端将第一个获取该当前分布式锁。当该客户端释放该当前分布式锁从该客户端队列删除后,更新处于该当前分布式锁的客户端队列的第一次序的客户端获取该当前分布式锁,以此类推。

以下本发明实施例以多个客户端进程需要访问打印机,获取打印机资源的执行打印操作的实施过程为例,对本发明的一种分布式锁实现方法做具体介绍。可认为是对图3中当前分布式锁1的访问过程使用该分布式锁实现方法的实施例。对图3中当前分布式锁2以及当前分布式锁3的访问过程均适用该实施例,在此不做过多举例。

步骤一,当前分布式锁1下的至少一个客户端发送加锁操作请求lock到服务器。

步骤二,服务器获取当前分布式锁1下的至少一个客户端的加锁操作请求,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁1的客户端队列。

具体为,至少一个客户端发起加锁操作请求lock后,服务器接收到加锁操作请求lock后,按照至少一个客户端发起加锁操作请求的时间顺序,建立该当前分布式锁1下的客户端队列lockqueue,将该将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁1的客户端队列中。

与该打印机连接的至少一个客户端向服务器发送需要获取打印机的资源的加锁操作请求lock,服务器接收到获取打印机的资源的加锁操作请求lock后,按照与该打印机连接的至少一个客户端发送需要获取打印机的资源的加锁操作请求的时间顺序,建立该打印机分布式锁下的客户端队列lockqueue,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到该打印机分布式锁下的客户端队列中。

步骤三,根据客户端队列的顺序,当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,将当前分布式锁1分配给第一客户端,其中,客户端队列包括当前分布式锁1下的至少一个客户端,第一客户端为至少一个客户端中的任一客户端。

具体为,服务器从客户端队列头部取出一个客户端,也就是更新处于客户端队列中的第一次序的客户端,将当前分布式锁1分配给客户端。当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,服务器将当前分布式锁1分配给第一客户端。另外,服务器还可发送当前分布式锁1已占用信息返回给当前分布式锁1下的至少一个客户端除第一客户端以外的客户端,通知该第一客户端获取了该当前分布式锁1。

服务器从该打印机分布式锁下的客户端队列头部取出一个客户端,也就是更新处于该打印机分布式锁下的客户端队列中的第一次序的客户端,将该打印机分布式锁分配给该客户端。当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,服务器将该打印机分布式锁分配给该第一客户端。另外,服务器还可发送该打印机分布式锁已占用信息,返回给该打印机分布式锁下的至少一个客户端除第一客户端以外的客户端,通知该第一客户端获取了该该打印机分布式锁。

步骤四,根据服务器的客户端队列的顺序,当第一客户端、更新处于客户端队列中的第一次序时,当前分布式锁1下的第一客户端获取当前分布式锁1,第一客户端对当前分布式锁1的资源加锁,并根据当前分布式锁1的资源执行相应的操作。或者

根据服务器的客户端队列的顺序,当第一客户端未处于客户端队列中的第一次序时,等待当前分布式锁的分配。

具体为,根据服务器的客户端队列的顺序,当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,该打印机分布式锁下的第一客户端,获取该打印机分布式锁,第一客户端对该打印机分布式锁的资源加锁,并根据该打印机分布式锁的资源执行打印操作。或者根据该服务器的客户端队列的顺序,当该第一客户端未处于该打印机分布式锁的客户端队列中的第一次序时,等待该打印机分布式锁的分配。

步骤五,当第一客户端使用完成当前分布式锁1的资源后,第一客户端对当前分布式锁1的资源执行解锁操作,将当前分布式锁1的资源释放,并发送当前分布式锁1未占用信息到服务器。

具体为,当该第一客户端使用完该当前分布式锁的资源后,会调用unlock操作,以释放该当前分布式锁,并发送该当前分布式锁未占用信息到服务器。

当该第一客户端使用完该打印机分布式锁的资源后,该第一客户端调用unlock操作,以释放该打印机分布式锁的资源,并发送该打印机分布式锁未占用信息到服务器。

步骤六,服务器获取第一客户端的当前分布式锁1未占用信息,将客户端队列中的第一客户端删除。

具体为,服务器获取第一客户端的该打印机分布式锁未占用信息,将该打印机分布式锁的客户端队列中的第一客户端删除。

步骤七,根据客户端队列的顺序,当至少一个客户端中除第一客户端以外的客户端、更新处于客户端队列中的第一次序处时,服务器将当前分布式锁1分配给客户端队列中的第一次序的、至少一个客户端中除第一客户端以外的客户端。

具体为,当服务端收到第一客户端的unlock操作后,便会将该第一客户端从该客户端队列头部删除,也就是将该第一客户端从该客户端队列中的第一次序处删除。如果该客户端队列中还有其他客户端等待该当前分布式锁的资源,当至少一个客户端中除第一客户端以外的客户端、更新处于客户端队列中的第一次序处时,服务器将当前分布式锁分配给客户端队列中的第一次序的、至少一个客户端中除第一客户端以外的客户端,依次重复上述步骤。

当服务端收到第一客户端的unlock操作后,便会将该第一客户端从该打印机分布式锁的客户端队列头部删除,也就是将该第一客户端从该打印机分布式锁的客户端队列中的第一次序处删除。如果该打印机分布式锁的客户端队列中还有其他客户端等待该打印机分布式锁的资源,当至少一个客户端中除第一客户端以外的客户端、更新处于该打印机分布式锁的客户端队列中的第一次序处时,服务器将该打印机分布式锁分配给客户端队列中的第一次序的、至少一个客户端中除第一客户端以外的客户端,依次重复上述步骤。

需要说明的是,任何通过本发明实施例获得分布式锁,并利用该分布式锁的资源执行相应操作的分布式锁实现方法,都属于本发明实施例的保护范围,在此不一一列举。

为达到上述发明目的,本发明实施例公开了一种分布式锁实现装置,应用于服务器端,如图4所示。图4为本发明实施例的一种分布式锁实现装置应用于服务器端的装置图,包括:

入队模块401,用于获取当前分布式锁下的至少一个客户端的加锁操作请求,将至少一个客户端的加锁操作请求对应的至少一个客户端,加入到当前分布式锁的客户端队列;

第一分配模块402,用于根据客户端队列的顺序,当至少一个客户端中的第一客户端、更新处于客户端队列中的第一次序时,将当前分布式锁分配给第一客户端,其中,客户端队列包括当前分布式锁下的至少一个客户端,第一客户端为至少一个客户端中的任一客户端;;

删除模块403,用于当第一客户端使用完成当前分布式锁的资源后,获取第一客户端的当前分布式锁未占用信息,将客户端队列中的第一客户端删除;

第二分配模块404,用于根据客户端队列的顺序,当至少一个客户端中除第一客户端以外的客户端、更新处于客户端队列中的第一次序时,将当前分布式锁分配给客户端队列中的第一次序的、至少一个客户端中除第一客户端以外的客户端。

本发明实施例公开了一种分布式锁实现装置,在服务器端利用队列先进先出的思想,无须将某个分布式锁下面的至少一个客户端找到并返回给所有客户端。所有的排序均在服务端完成,而且通过队列的数据结构,能保证按照先后有序存放,节省了现有技术每次需要在客户端排序的开销。本发明实施例的一种分布式锁实现方法,不需要大量数据在客户端和服务端传递,也无须再客户端对大量数据排序,减少了冗余数据传输以及不必要的重复排序,对系统处理数据的性能以及可扩展性有大提升。

需要说明的是,本发明实施例的装置是应用于上述服务器端分布式锁实现方法的装置,则上述服务器端分布式锁实现方法的所有实施例均适用于该装置,且均能达到相同或相似的有益效果。

可选地,入队模块401,包括:

获取请求子模块,用于获取当前分布式锁下的至少一个客户端发送的加锁操作请求;

第一入队子模块,用于当客户端队列未满时,按照至少一个客户端发送的加锁操作请求的时间顺序,将至少一个客户端加入到客户端队列;

第二入队子模块,用于当客户端队列已满时,等待处于客户端队列中的第一次序的客户端使用完成当前分布式锁后,删除处于客户端队列中的第一次序的客户端,按照至少一个客户端发送的加锁操作请求的时间顺序,将至少一个客户端中的一个客户端加入到客户端队列。

可选地,分布式锁实现装置还包括:

信息发送模块,用于发送当前分布式锁已占用信息,到当前分布式锁下的至少一个客户端中除第一客户端以外的客户端。

为达到上述发明目的,本发明实施例还公开了一种分布式锁实现装置,应用于至少一个客户端,至少一个客户端包括第一客户端,如图5所示。图5为本发明实施例的一种分布式锁实现装置应用于客户端的装置图,包括:

信息发送模块501,用于当前分布式锁下的至少一个客户端中的第一客户端,发送加锁操作请求到服务器,其中,第一客户端为至少一个客户端的任一客户端;

获取锁模块502,用于根据服务器的客户端队列的顺序,当第一客户端、更新处于客户端队列中的第一次序时,当前分布式锁下的第一客户端获取当前分布式锁,第一客户端对当前分布式锁的资源加锁,并根据当前分布式锁的资源执行相应的操作;

解锁模块503,用于当第一客户端使用完成当前分布式锁后,第一客户端对当前分布式锁的资源执行解锁操作,将当前分布式锁的资源释放,并发送当前分布式锁未占用信息到服务器;或

等待模块504,用于根据服务器的客户端队列的顺序,当第一客户端未处于客户端队列中的第一次序时,等待当前分布式锁的分配。

本发明实施例公开了一种分布式锁实现装置,客户端按照在服务器端的客户端队列的顺序获得到该分布式锁的资源,所有的排序均在服务端完成,而且通过队列的数据结构,能保证按照先后有序存放,节省了现有技术每次需要在客户端排序的开销。并且对于每个客户端对获得的分布式锁的资源加锁和解锁的操作均为o(1),操作效率高。本发明实施例的一种分布式锁实现方法,不需要大量数据在客户端和服务端传递,也无须再客户端对大量数据排序,减少了冗余数据传输以及不必要的重复排序,对系统处理数据的性能以及可扩展性有大提升。

可选地,等待模块504,具体用于,根据服务器的客户端队列的顺序,当第一客户端未处于客户端队列中的第一次序时,第一客户端接收服务器发送的当前分布式锁已占用信息,等待当前分布式锁的分配。

需要说明的是,本发明实施例的装置是应用于上述客户端分布式锁实现方法的装置,则上述客户端分布式锁实现方法的所有实施例均适用于该装置,且均能达到相同或相似的有益效果。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。

本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1