CN111475516A - 分布式锁的调用方法、装置、计算机设备及存储介质 - Google Patents
分布式锁的调用方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN111475516A CN111475516A CN202010147521.5A CN202010147521A CN111475516A CN 111475516 A CN111475516 A CN 111475516A CN 202010147521 A CN202010147521 A CN 202010147521A CN 111475516 A CN111475516 A CN 111475516A
- Authority
- CN
- China
- Prior art keywords
- distributed lock
- temporary node
- annotations
- distributed
- calling
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
- G06F16/2343—Locking methods, e.g. distributed locking or locking implementation details
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例属于数据资源分布式调用的技术领域,涉及一种分布式锁的调用方法,包括根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数;根据所述调用函数,定义至少一组与一个所述调用函数相对应的注解;将所述注解插入到业务代码需要操作分布式锁的相应位置;在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。本申请还提供一种分布式锁的调用装置、计算机设备及存储介质。本申请能够通过标签在代码的特定位置调使用分布式锁。无需多次编辑代码,或对一个完整的分布式锁的类进行频繁的实例化,大大降低了代码的调用复杂度,并能够有效的提升代码的运行效率。
Description
技术领域
本申请涉及数据资源分布式调用的技术领域,尤其涉及一种分布式锁的调用方法、装置、计算机设备及存储介质。
背景技术
服务器上存放的数据资源可以被多个任务同时调用处理。为了保证大家访问的数据是一致的,就要求对资源加锁,使得当一个任务对该资源进行访问的时候,其他资源无法对该资源进行访问,如此能够防止各个进程读取到不一样的数据。在分布式的应用环境当中,同样存在类似的应用场景,需要对资源提供加锁,而在这种应用场景当中,需要对分布在各个服务器上的资源用分布式锁,保证同一时间在所有的服务器上,只有一个进程对同一个资源进行访问,防止各个进程之间出现访问到的资源不统一的问题。
现有常见的分布式锁方案包括:①基于数据库实现;②基于redis实现;③基于zookeeper实现,这三种实现方式,其中zookeeper的实现效果较好,所以常常作为推荐的实现方法。但是zookeeper的实现过程相对复杂,在程序编辑的过程当中,开发人员需要通过复杂的程序语句对zookeeper进行调用,即便是将其中的一些步骤封装为公有函数进行调用,因为需要加锁的业务代码通常有很多处,代码量依然很大,以至于影响开发速度。除此之外,当前状况下,如果开发人员使用zookeeper锁,调用过程并非完全透明的,需要开发人员事先学习该工具的相关原理,才能具备对zookeeper锁的调用能力。总体来说对其实现调用的程序编辑效率不高。虽然也可以使用分布式锁的部署工具来逐个撰写或者通过函数调用分布式锁的方法,但相应的性能出色的分布式锁的部署工具一般都相对复杂,在使用的过程当中同样会产生上述问题。
此外,分布式锁因为是在不同业务中的特定步骤之前或之后使用,其调用本身简单但是灵活多样,在现有的操作过程当中,这些步骤在私有函数当中,仅供一处业务代码进行调用,或者是封装为一组类库供编辑业务代码的工程师调用,对于面向过程的编程思路而言,使用者将会在程序文件中直接通过zookeeper框架中定义的函数一步一步的判断节点,创建节点,监控事件,获取和释放锁。而对于常规的面向对象的编程方法而言,分布式锁的获取和释放这一系列的操作,很难抽象到一个具体类或者对象当中,在调用的过程当中,因为对象中有关锁的函数和其他的主体函数同时存在,所以只能在主体函数相应的对象中调用锁,并且与主体函数有关的业务中实现复用,那么对应多组业务代码就需要定义多种类与其相对应,这样代码的复用将大大折扣,代码量相对还是较大且繁杂,影响开发进度,并且影响运行的开销。
发明内容
本申请实施例的目的在于提出一种能够在调用分布式锁时操作尽量透明,以高效的实现分布式锁调用的调用方法。
为了解决上述技术问题,本申请实施例提供一种分布式锁的调用方法,采用了如下所述的技术方案:
一种分布式锁的调用方法,包括下述步骤:根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数;针对每一组调用函数,定义至少一组相对应的注解,所述注解中包括指定对应业务代码的参数,并且所述注解均具有标记以表明注解的种类;将所述注解插入到业务代码需要操作分布式锁的相应位置;在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。
进一步的,所述在运行业务代码的状态下,根据插入的至少一组注解的种类和包含的参数,执行分布式锁的调用和/或释放的步骤具体包括:连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点;判断所述临时节点是否为最小临时节点;如果不是最小临时节点,则监听比自身优先级高一位的临时节点,直到所述优先级高一位的节点释放分布式锁;如果为最小临时节点或者没有其他临时节点正在排队和使用分布式锁,获取分布式锁,并触发业务代码实现主要功能;业务代码实现主要功能后,释放分布式锁。
进一步的,临时节点名称用于确定该业务代码对应临时节点的路径位置;所述根据所述注解的种类和包含的参数创建临时节点的步骤具体包括:遍历业务代码,判断是否有预定义的临时节点名称;如果存在所述预定义的临时节点名称,则根据预定义的临时节点名称确定临时节点的路径;如果不存在所述预定义的临时节点名称,则根据业务代码的名称确定一个临时节点的路径,并生成临时节点对应的临时节点名称;将与临时节点名称对应的所述路径加入到序列当中以完成临时节点的创建。
进一步的,在所述连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点的步骤之前还包括:触发到所述注解时,遍历所有的业务代码,提取业务代码中所有的分布式锁相关的注解,以获取该业务代码所需要的所有分布式锁相关操作;根据所述临时节点名称,提取相互相关的所述注解。
进一步的,所述参数还包括超时时间,所述超时时间用于设置获取到分布式锁之后的超时时间,防止分布式锁的发放陷入死锁;在所述获取分布式锁,并触发业务代码实现主要功能的步骤之后还包括:监控分布式锁占用时间;若分布式锁占用时间超过了所述超时时间,重新根据所述注解生成临时节点并排序。
进一步的,将所述注解插入到业务代码需要操作分布式锁的相应位置,具体包括:在业务代码的开始位置插入获取分布式锁种类的注解;在业务代码结束位置插入释放分布式锁种类的注解。
为了解决上述技术问题,本申请实施例还提供一种分布式锁的调用装置,采用了如下所述的技术方案:
一种分布式锁的调用装置,包括:函数生成模块,用于根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数;注解模块,用于针对每一组调用函数,定义至少一组相对应的注解,所述注解中包括指定对应业务代码的参数,并且所述注解均具有标记以表明注解的种类;;还用于将所述注解插入到业务代码需要操作分布式锁的相应位置;及执行模块,用于在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。
进一步的,所述执行模块包括:临时节点子模块,用于连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点;判断子模块:用于判断所述临时节点是否为最小临时节点;监听子模块,用于在所述临时节点不是最小临时节点时,监听比自身优先级高一位的临时节点,直到所述优先级高一位的节点释放分布式锁;调用子模块,用于在所述临时节点为最小临时节点或者没有其他临时节点正在排队和使用分布式锁时,获取分布式锁,并触发业务代码实现主要功能;及释放子模块:用于业务代码实现主要功能后,释放分布式锁。
一种分布式锁的调用装置,包括:
函数生成模块,用于根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数;
注解模块,用于根据所述调用函数,定义至少一组与一个所述调用函数相对应的注解;还用于将所述注解插入到业务代码需要操作分布式锁的相应位置;及
执行模块,用于在运行业务代码的状态下,根据插入的至少一组注解的种类和包含的参数,执行分布式锁的调用和/或释放。
进一步的,所述执行模块包括:临时节点子模块,用于连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点;还用于判断所述临时节点是否为最小临时节点,如果不是则监听比自身优先级高一位的临时节点直到所述优先级高一位的节点释放分布式锁;及
调用子模块,用于获取分布式锁,并触发业务代码实现主要功能;还用于业务代码实现主要功能后,释放分布式锁;
为了解决上述技术问题,本申请实施例还提供一种计算机设备,采用了如上所述的分布式锁的调用方法的步骤;
为了解决上述技术问题,本申请实施例还提供一种计算机可读存储介质,采用了如上所述的分布式锁的调用方法的步骤。
与现有技术相比,本申请实施例主要有以下有益效果:通过首先根据分布式锁的框架预设相应的一组调用函数,并且通过注解与调用函数相对应,其中,注解与特定的一组调用函数相对应。将注解插入到业务代码需要操作分布式锁的相应位置,插入的注解与其要实现的分布式锁的业务类型相对应以便通过对其种类的识别确定其要调用的参数。在运行业务代码的状态下,根据识别的注解种类找到相应的业务代码,并且根据注解中携带的参数去执行分布式锁的调用和释放。该方案能够通过标签的种类和参数直接在代码的特定位置调用预设的函数,并通过预设的函数使用分布式锁框架中的功能。无需多次编辑代码,或者对一个完整的分布式锁的类进行频繁的实例化,大大降低了代码的调用复杂度,并能够有效的提升代码的运行效率。
附图说明
为了更清楚地说明本申请中的方案,下面将对本申请实施例描述中所需要使用的附图作一个简单介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请可以应用于其中的示例性系统架构图;
图2根据本申请的一种分布式锁的调用方法的一个实施例的流程图;
图3是图2中步骤S40的一种具体实施方式的流程图;
图4是图3中步骤S401的一种具体实施方式的流程图;
图5是根据本申请的一种分布式锁的调用装置的一个实施例的结构示意图;
图6是根据本申请的计算机设备的一个实施例的结构示意图。
附图标记:
5——分布式锁的调用装置、51——函数生成模块、52——注解模块、53——执行模块、531——临时节点子模块、532——调用子模块。
具体实施方式
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同;本文中在申请的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本申请;本申请的说明书和权利要求书及上述附图说明中的术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。本申请的说明书和权利要求书或上述附图中的术语“第一”、“第二”等是用于区别不同对象,而不是用于描述特定顺序。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
为了使本技术领域的人员更好地理解本申请方案,下面将结合附图,对本申请实施例中的技术方案进行清楚、完整地描述。
如图1所示,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如网页浏览器应用、购物类应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。
终端设备101、102、103可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、电子书阅读器、MP3播放器(Moving Picture ExpertsGroup Audio Layer III,动态影像专家压缩标准音频层面3)、MP4(Moving PictureExperts Group Audio Layer IV,动态影像专家压缩标准音频层面4)播放器、膝上型便携计算机和台式计算机等等。
服务器105可以是提供各种服务的服务器,例如对终端设备101、102、103上显示的页面提供支持的后台服务器。
需要说明的是,本申请实施例所提供的一种分布式锁的调用方法一般由服务器/终端设备执行,相应地,一种分布式锁的调用方法装置一般设置于服务器/终端设备中。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
参考图2,示出了根据本申请的一种分布式锁的调用方法的一个实施例的流程图。所述的一种分布式锁的调用方法,包括以下步骤:
步骤S100:根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数。
分布式锁的调用方法运行于其上的电子设备(例如图1所示的服务器/终端设备)可以通过有线连接方式或者无线连接方式进行服务器和客户端之间的交互。需要指出的是,上述无线连接方式可以包括但不限于3G/4G连接、WiFi连接、蓝牙连接、WiMAX连接、Zigbee连接、UWB(ultra wideband)连接、以及其他现在已知或将来开发的无线连接方式。
具体的,所述分布式锁的调用方法能够结合包括不限于redis、zookeeper等市面上已知的或未知的分布式锁框架使用,根据该方法所具体结合的分布式锁框架,预设至少一组调用函数,以调用和实现框架中所提供的功能,在预设调用函数的过程当中,调用函数之间相互独立,直接面向分布式锁框架本身,即使调用函数相互之间可以存在逻辑上的先后关系,比如一个调用函数的导出结果,作为另外一个调用函数的导入参数,但是调用函数之间在一个函数库文件当中,不存在嵌套或隶属的关系,被注解引用状态下直接运行,而无需其他的代码调用激活。
步骤S200:针对每一组调用函数,定义至少一组相对应的注解,所述注解中包括指定对应业务代码的参数,并且所述注解均具有标记以表明注解的种类。
具体通过对注解的解读以引用相关的业务代码,在定义注解的过程当中,每个注解都与一个确定的调用函数相对应,通过解读该注解,仅能引用到一个特定的函数,以防止二义性,但是根据对调用函数的使用方式的不同,一些调用可能适用于多个应用场景,所以需要在任何场景当中都能产生对函数的调用,此时多个定义的注解可能引用的是同一个调用函数,而通过注解本身的不同去适应不同的应用场景,最终实现不同的对分布式锁框架的实现方式。通过对分布式锁本身涉及到的功能编辑相关的函数,并且定义相关的注解与之相对应,能够将分布式锁相关的逻辑与业务代码相剥离,对分布式锁的调用仅通过在任务业务代码中调用一个注解来实现。
步骤S300:将所述注解插入到业务代码需要操作分布式锁的相应位置。
当一组业务代码(通常本身是一个函数,或者是自定义函数)需要访问一处分布式资源,并且该分布式资源需要排他调用,以保证数据的一致性的时候,将用于调用分布式锁种类的注解设置在这组业务代码的头部,供读取和调用,并在其尾部设置相应的用于释放分布式锁种类注解,以备在业务完成时释放分布式锁。对于注解的放置,需要根据注解与调用函数之间的对应关系进行相应的设置,以使得在遍历业务代码的过程当中,能够明确每处业务代码所对应的分布式锁相关的调用函数,比如与获取和监听分布式锁相对应的注解应该放在业务代码的前部,与释放分布式锁相对应的注解应当放置在业务代码的后部。但是需要明确的是,对于调用函数内部的实现过程,注解并不关心,除了可选的传递部分参数以外。所以在使用注解时完全无需了解分布式锁框架的运行原理。
步骤S400:在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。
具体在业务代码运行的过程当中,触发到所述注解时,遍历所有的业务代码,提取业务代码中所有的分布式锁相关的注解,以获取该业务代码所需要的所有分布式锁相关操作。其中,注解的种类与其所对应的调用函数相关,比如指定调用函数是分布式锁的调用函数、释放函数,或者是监听函数,注解中包括有相关的参数,对于注解当中设置的参数,是在指定分布式锁的调用需求时额外指定,比如指定调用某种特定的分布式锁,自定分布式锁的过期时间,分布式锁的作用范围等等,以指定对应业务代码的相关参数,供分布式锁的调用函数使用为对应的业务代码加锁,释放锁,和进行其它特定的分布式锁的操作和监控。
在本实施例的一些可选的实现方式中,步骤S400在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。具体包括:
步骤S401:连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点。
所述参数包括临时节点名称、超时时间、参数分割符。所述临时节点名称用于确定该业务代码对应临时节点的路径位置;所述超时时间,用于设置获取到分布式锁之后的超时时间,防止分布式锁的发放陷入死锁;所述参数分割符,用于分割所述注解中的参数。
分布式锁服务的调用通常是通过相对于用户端和服务器端的第三方,也就是分布式锁服务端实现。
用户端向分布式所服务端请求分布式锁服务,并具体在分布式锁服务端建立临时节点,在服务器端建立的临时节点记载了某一台用户端对于某一服务器端上的资源的访问请求,分布式锁服务端记录了所有的资源,以及这些资源是否被分布式锁锁定,还用来监控哪些服务正在通过分布式锁进行访问,哪些服务正在排队等待分布式锁,以临时节点为单位,进行业务排队,通过分布式锁服务端的控制依次获得分布式锁,并执行业务代码的主要功能。分布式锁的实现是通过访问控制实现的,在同一时间内,通过白名单、令牌或其他的限制方式将访问权限集中到某个用户端上的任务对某个服务器端的请求上,当该任务实现了访问之后,才将访问的权限转移出去,通过创建临时节点,在任务待领取数据访问权限的状态下,进行排序,以明确自身获取访问权限的优先级。
步骤S402:判断所述临时节点是否为最小临时节点。
步骤S403:如果不是最小临时节点,则监听比自身优先级高一位的临时节点,直到所述优先级高一位的节点释放分布式锁。
临时节点通过标记确定其优先级,在一种实施例中,对每一个临时节点分配逐步增大的编号标记,通过编号的大小确定临时节点的优先级,在另一种实施例当中,根据临时节点创建的时间确定临时节点的标记,并确定临时节点的优先级。在一些实施例当中可以对特殊处理的任务指定标记,以干预其优先级。分布式锁的获取正如其锁定的资源一样,是按照次序依次获得的,在其他同类业务程序没有完成其相应业务,并且持有分布式锁的状态下,根据临时节点的序列监控相应的比自身优先级高一位的临时节点,直到其释放分布式锁。如此有序的规划每个用户端的每个请求对服务端资源的使用。
步骤S404:如果为最小临时节点或者没有其他临时节点正在排队和使用分布式锁,获取分布式锁,并触发业务代码实现主要功能。
业务代码获取到相应资源的分布式锁之后,将相应的资源锁定并且执行相应的业务逻辑,在资源被独占不会产生误读,脏读的状态下实现。其中所述脏读是一种数据库并发读取过程中的错误形式,脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。通过锁定相应的资源并且仅允许相应的业务代码对资源进行访问,使得误读脏读被消除。
步骤S405:业务代码实现主要功能后,释放分布式锁。
当业务代码实现了其自身的相关逻辑后,释放分布式锁,之后相邻的优先级低一位的临时节点获取所述分布式锁,而释放了分布式锁的业务代码所对应的临时节点,在一段时间时候自动清除。该方案能够规范的申请和释放分布式锁,保证分布式锁的机制能够持续有效的使用。
该方案通过设置临时节点进行排序,有序的通过分布式锁框架对业务代码实现分布式锁业务。
在本实施例的一些可选的实现方式中,所述参数包括临时节点名称、超时时间、参数分割符,步骤S401:根据所述注解的种类和包含的参数创建临时节点的步骤具体包括:
步骤S4011:遍历业务代码,判断是否有预定义的临时节点名称。
在zookeeper当中,创建临时节点,并且将临时节点放入临时锁的分配序列当中进行排队,最终获得分布式锁并执行任务代码,临时节点需要定义有一个临时节点名称,遍历业务代码查找业务代码中设置的注解,并且在注解中查找预设的临时节点名称,如果预设了业务代码对应的临时节点的名称,所述临时节点名称会以参数的形式放置在注解当中,其中临时节点名称不是注解中的非空参数,操作者根据对临时节点名称的了解,在注解中加入这个参数,但是对于操作者不知道临时参数名称的情况,注解中的相应参数会留空,所以在遍历业务代码的过程中,需要确认注解中是否存在预设的临时节点名称。
步骤S4012:如果存在所述预定义的临时节点名称,则根据预定义的临时节点名称确定临时节点的路径。
如果找到了预设的业务代码对应的临时节点的名称,以该名称命名一个临时节点,并且与该临时节点所在路径相结合,提供给zookeeper的服务端,之后zookeeper对该临时节点进行排序并提供分布式锁的服务。
步骤S4013:如果不存在所述预定义的临时节点名称,则根据业务代码的名称确定一个临时节点的路径,并生成临时节点对应的临时节点名称。
如果在业务代码中没有找到定义业务代码对应临时节点名称的注解,或者在业务代码中设置的注解中相关字段不属于临时节点名称所对应的数据类别,则根据业务代码本身的名称命名其相对应的临时节点,并且将该临时节点的名称与路径相结合传输给zookeeper的服务端。
步骤S4014:将与临时节点名称对应的所述路径加入到序列当中以完成临时节点的创建。
Zookeeper的服务端接收到临时节点的信息将该临时节点根据其路径放置进排序队列中,排序队列中有序放置有若干个路径,每个路径对应一个临时节点,根据排序队列中路径的排序对相应的临时节点所对应的业务代码提供分布式锁的服务。该方法能够保证临时节点的可溯性。
在注解当中通过参数分隔符分割各个参数,并且通过设置超时时间,定义该临时节点所能一次性够持有分布式锁的最长时间,该临时节点持有分布式锁超过了超时时间后,将自行解除分布式锁的占用。
在本实施例的一些可选的实现方式中,在步骤S401:连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点之前,还包括步骤S401`:触发到所述注解时,遍历所有的业务代码,提取业务代码中所有的分布式锁相关的注解,以获取该业务代码所需要的所有分布式锁相关操作,并且根据所述临时节点名称,提取相互相关的所述注解。
分布式锁通常包括加锁的和释放锁的过程,通过注解的临时节点名称,将针对同一个业务的加锁和释放锁的注解提取出来,单独进行处理,如此任务实际执行时,时序整洁规范。
在步骤S404:获取分布式锁,并触发业务代码实现主要功能之后还包括:
监控分布式锁占用时间;若分布式锁占用时间超过了所述超时时间,重新根据所述注解生成临时节点并排序。
一般这种超时情况不是因为业务代码本身的设计原因导致的,可能是运行环境不适合这段业务代码运行,可能是运行过程中意外发生了死锁,一般超时时间都会设置的比业务代码完全跑完所需要的时间多得多。所以重新把这段业务代码挂起,排序之后,下一次轮到它执行的时候,它直接重头执行,无需从上次运行中断的点重新运行,避免出现死锁。
当确定分布式锁超时,则确定该分布式锁已经强制释放,此时,主业务代码并不能保证完全执行完毕,重新根据业务代码生成临时节点,并且在队列中进行排序,能够使得代码在之后的运行过程当中继续运行,以完成相应的业务。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,前述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)等非易失性存储介质,或随机存储记忆体(Random Access Memory,RAM)等。
应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
进一步参考图5作为对上述图2所示方法的实现,本申请提供了一种分布式锁的调用装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
如图5所示,本实施例所述的一种分布式锁的调用装置5包括:函数生成模块51、注解模块52以及执行模块53。其中:
函数生成模块51用于根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数。
注解模块52用于针对每一组调用函数,定义至少一组相对应的注解,所述注解中包括指定对应业务代码的参数,并且所述注解均具有标记以表明注解的种类;还用于将所述注解插入到业务代码需要操作分布式锁的相应位置。
在一种实施例中,将所述注解插入到业务代码需要操作分布式锁的相应位置具体是:在业务代码的开始位置插入获取分布式锁种类的注解;
在业务代码结束位置插入释放分布式锁种类的注解。
执行模块53用于在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。
本方案通过首先根据分布式锁的框架预设相应的一组调用函数,并且通过注解与调用函数相对应,其中,注解与特定的一组调用函数相对应。将注解插入到业务代码需要操作分布式锁的相应位置,插入的注解与其要实现的分布式锁的业务类型相对应以便通过对其种类的识别确定其要调用的参数。在运行业务代码的状态下,根据识别的注解种类找到相应的业务代码,并且根据注解中携带的参数去执行分布式锁的调用和释放。该方案能够通过标签的种类和参数直接在代码的特定位置调用预设的函数,并通过预设的函数使用分布式锁框架中的功能。无需多次编辑代码,或者对一个完整的分布式锁的类进行频繁的实例化,大大降低了代码的调用复杂度,并能够有效的提升代码的运行效率。
参阅图5,执行模块53包括临时节点子模块531、判断子模块532、监听子模块533、调用子模块534以及释放子模块535。其中,临时节点子模块531用于连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点。
判断子模块532:用于判断所述临时节点是否为最小临时节点。
监听子模块533,用于在所述临时节点不是最小临时节点时,监听比自身优先级高一位的临时节点,直到所述优先级高一位的节点释放分布式锁。
调用子模块534用于在所述临时节点为最小临时节点或者没有其他临时节点正在排队和使用分布式锁时,获取分布式锁,并触发业务代码实现主要功能。
释放子模块535,用于业务代码实现主要功能后,释放分布式锁。
该方案通过设置临时节点进行排序,有序的通过分布式锁框架对业务代码实现分布式锁业务。
进一步的,所述参数包括临时节点名称;所述临时节点名称用于确定该业务代码对应临时节点的路径位置。
临时节点子模块531还用于遍历业务代码,判断是否有预定义的临时节点名称。
还用于:如果存在所述预定义的临时节点名称,则根据预定义的临时节点名称确定临时节点的路径。
还用于:如果不存在所述预定义的临时节点名称,则根据业务代码的名称确定一个临时节点的路径,并生成临时节点对应的临时节点名称。
还用于:将与临时节点名称对应的所述路径加入到序列当中以完成临时节点的创建。
该方案通过预定义的临时节点名称确定一个临时节点路径,如此节省了确认临时节点路径的步骤,如果没有对临时节点预定义临时节点路径,则生成一个临时节点路径进行使用,同时对临时节点生成临时节点名称,该方案有利于节省硬件开销。
进一步的,临时节点子模块531还用于触发到所述注解时,遍历所有的业务代码,提取业务代码中所有的分布式锁相关的注解,以获取该业务代码所需要的所有分布式锁相关操作。
还用于:根据所述临时节点名称,提取相互相关的所述注解。
该方案有利于提取业务代码中相互相关的注解,以实现对分布式锁的使用监控,保证分布式锁调用的完整。
进一步的,所述执行模块53还包括重排子模块536,重排子模块536用于监控分布式锁占用时间。
还用于:若分布式锁占用时间超过了所述超时时间,重新根据所述注解生成临时节点并排序。
该方案有利于在一组业务代码没有顺利执行的状态下,尝试对这组业务代码重复进行执行的尝试。以保证业务代码的顺利实现。
为解决上述技术问题,本申请实施例还提供计算机设备。具体请参阅图6,图6为本实施例计算机设备基本结构框图。
所述计算机设备6包括通过系统总线相互通信连接存储器61、处理器62、网络接口63。需要指出的是,图中仅示出了具有组件61-63的计算机设备6,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。其中,本技术领域技术人员可以理解,这里的计算机设备是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,其硬件包括但不限于微处理器、专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、可编程门阵列(Field-Programmable GateArray,FPGA)、数字处理器(Digital Signal Processor,DSP)、嵌入式设备等。
所述计算机设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述计算机设备可以与用户通过键盘、鼠标、遥控器、触摸板或声控设备等方式进行人机交互。
所述存储器61至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,所述存储器61可以是所述计算机设备6的内部存储单元,例如该计算机设备6的硬盘或内存。在另一些实施例中,所述存储器61也可以是所述计算机设备6的外部存储设备,例如该计算机设备6上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(FlashCard)等。当然,所述存储器61还可以既包括所述计算机设备6的内部存储单元也包括其外部存储设备。本实施例中,所述存储器61通常用于存储安装于所述计算机设备6的操作系统和各类应用软件,例如一种分布式锁的调用方法的程序代码等。此外,所述存储器61还可以用于暂时地存储已经输出或者将要输出的各类数据。
所述处理器62在一些实施例中可以是中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器62通常用于控制所述计算机设备6的总体操作。本实施例中,所述处理器62用于运行所述存储器61中存储的程序代码或者处理数据,例如运行所述一种分布式锁的调用方法的程序代码。
所述网络接口63可包括无线网络接口或有线网络接口,该网络接口63通常用于在所述计算机设备6与其他电子设备之间建立通信连接。
本方案通过首先根据分布式锁的框架预设相应的一组调用函数,并且通过注解与调用函数相对应,其中,注解与特定的一组调用函数相对应。将注解插入到业务代码需要操作分布式锁的相应位置,插入的注解与其要实现的分布式锁的业务类型相对应以便通过对其种类的识别确定其要调用的参数。在运行业务代码的状态下,根据识别的注解种类找到相应的业务代码,并且根据注解中携带的参数去执行分布式锁的调用和释放。该方案能够通过标签的种类和参数直接在代码的特定位置调用预设的函数,并通过预设的函数使用分布式锁框架中的功能。无需多次编辑代码,或者对一个完整的分布式锁的类进行频繁的实例化,大大降低了代码的调用复杂度,并能够有效的提升该装置的运行效率。
本申请还提供了另一种实施方式,即提供一种计算机可读存储介质,所述计算机可读存储介质存储有一种分布式锁的调用程序,所述一种分布式锁的调用程序可被至少一个处理器执行,以使所述至少一个处理器执行如上述的一种分布式锁的调用方法的步骤。
本方案通过首先根据分布式锁的框架预设相应的一组调用函数,并且通过注解与调用函数相对应,其中,注解与特定的一组调用函数相对应。将注解插入到业务代码需要操作分布式锁的相应位置,插入的注解与其要实现的分布式锁的业务类型相对应以便通过对其种类的识别确定其要调用的参数。在运行业务代码的状态下,根据识别的注解种类找到相应的业务代码,并且根据注解中携带的参数去执行分布式锁的调用和释放。该方案能够通过标签的种类和参数直接在代码的特定位置调用预设的函数,并通过预设的函数使用分布式锁框架中的功能。无需多次编辑代码,或者对一个完整的分布式锁的类进行频繁的实例化,大大降低了代码的调用复杂度,并能够有效的提存储器上的代码的运行效率。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本申请各个实施例所述的方法。
显然,以上所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例,附图中给出了本申请的较佳实施例,但并不限制本申请的专利范围。本申请可以以许多不同的形式来实现,相反地,提供这些实施例的目的是使对本申请的公开内容的理解更加透彻全面。尽管参照前述实施例对本申请进行了详细的说明,对于本领域的技术人员来而言,其依然可以对前述各具体实施方式所记载的技术方案进行修改,或者对其中部分技术特征进行等效替换。凡是利用本申请说明书及附图内容所做的等效结构,直接或间接运用在其他相关的技术领域,均同理在本申请专利保护范围之内。
Claims (10)
1.一种分布式锁的调用方法,其特征在于,包括下述步骤:
根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数;
针对每一组调用函数,定义至少一组相对应的注解,所述注解中包括指定对应业务代码的参数,并且所述注解均具有标记以表明注解的种类;
将所述注解插入到业务代码需要操作分布式锁的相应位置;
在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。
2.根据权利要求1所述的一种分布式锁的调用方法,其特征在于,所述在运行业务代码的状态下,根据插入的至少一组注解的种类和包含的参数,执行分布式锁的调用和/或释放的步骤具体包括:
连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点;
判断所述临时节点是否为最小临时节点;
如果不是最小临时节点,则监听比自身优先级高一位的临时节点,直到所述优先级高一位的节点释放分布式锁;
如果为最小临时节点或者没有其他临时节点正在排队和使用分布式锁,获取分布式锁,并触发业务代码实现主要功能;
业务代码实现主要功能后,释放分布式锁。
3.根据权利要求2所述的一种分布式锁的调用方法,其特征在于,临时节点名称用于确定该业务代码对应临时节点的路径位置;
所述根据所述注解的种类和包含的参数创建临时节点的步骤具体包括:
遍历业务代码,判断是否有预定义的临时节点名称;
如果存在所述预定义的临时节点名称,则根据预定义的临时节点名称确定临时节点的路径;
如果不存在所述预定义的临时节点名称,则根据业务代码的名称确定一个临时节点的路径,并生成临时节点对应的临时节点名称;
将与临时节点名称对应的所述路径加入到序列当中以完成临时节点的创建。
4.根据权利要求3所述的一种分布式锁的调用方法,其特征在于,在所述连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点的步骤之前还包括:
触发到所述注解时,遍历所有的业务代码,提取业务代码中所有的分布式锁相关的注解,以获取该业务代码所需要的所有分布式锁相关操作;
根据所述临时节点名称,提取相互相关的所述注解。
5.根据权利要求3所述的一种分布式锁的调用方法,其特征在于,所述参数还包括超时时间,所述超时时间用于设置获取到分布式锁之后的超时时间,防止分布式锁的发放陷入死锁;在所述获取分布式锁,并触发业务代码实现主要功能的步骤之后还包括:
监控分布式锁占用时间;
若分布式锁占用时间超过了所述超时时间,重新根据所述注解生成临时节点并排序。
6.根据权利要求1-5任意一项所述的一种分布式锁的调用方法,其特征在于,将所述注解插入到业务代码需要操作分布式锁的相应位置,具体包括:
在业务代码的开始位置插入获取分布式锁种类的注解;
在业务代码结束位置插入释放分布式锁种类的注解。
7.一种分布式锁的调用装置,其特征在于,包括:
函数生成模块,用于根据分布式锁的框架内容,预设与分布式锁对应的至少一组调用函数;
注解模块,用于针对每一组调用函数,定义至少一组相对应的注解,所述注解中包括指定对应业务代码的参数,并且所述注解均具有标记以表明注解的种类;还用于将所述注解插入到业务代码需要操作分布式锁的相应位置;及
执行模块,用于在运行业务代码的状态下,根据插入的至少一组注解的种类和所述注解当中设置的参数,执行分布式锁的调用和/或释放。
8.根据权利要求7所述的一种分布式锁的调用装置,其特征在于,所述执行模块包括:
临时节点子模块,用于连接分布式锁服务端,根据所述注解的种类和包含的参数创建临时节点;
判断子模块:用于判断所述临时节点是否为最小临时节点;
监听子模块,用于在所述临时节点不是最小临时节点时,监听比自身优先级高一位的临时节点,直到所述优先级高一位的节点释放分布式锁;
调用子模块,用于在所述临时节点为最小临时节点或者没有其他临时节点正在排队和使用分布式锁时,获取分布式锁,并触发业务代码实现主要功能;及
释放子模块:用于业务代码实现主要功能后,释放分布式锁。
9.一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时实现如权利要求1至6中任一项所述的分布式锁的调用方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至6中任一项所述的分布式锁的调用方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010147521.5A CN111475516A (zh) | 2020-03-05 | 2020-03-05 | 分布式锁的调用方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010147521.5A CN111475516A (zh) | 2020-03-05 | 2020-03-05 | 分布式锁的调用方法、装置、计算机设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111475516A true CN111475516A (zh) | 2020-07-31 |
Family
ID=71748152
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010147521.5A Pending CN111475516A (zh) | 2020-03-05 | 2020-03-05 | 分布式锁的调用方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111475516A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112181804A (zh) * | 2020-08-31 | 2021-01-05 | 五八到家有限公司 | 一种参数校验方法、设备以及存储介质 |
CN112799791A (zh) * | 2021-01-22 | 2021-05-14 | 平安普惠企业管理有限公司 | 分布式锁的调用方法、装置、电子设备和存储介质 |
CN113407553A (zh) * | 2021-05-14 | 2021-09-17 | 重庆锐云科技有限公司 | 一种分布式锁的实现方法、系统、设备及存储介质 |
CN113535762A (zh) * | 2021-07-14 | 2021-10-22 | 北京数码视讯支付技术有限公司 | 安全的账户代付方法和装置 |
CN114579183A (zh) * | 2022-04-29 | 2022-06-03 | 之江实验室 | 一种用于分布式计算的作业分解处理方法 |
CN115357626A (zh) * | 2022-09-06 | 2022-11-18 | 中国建设银行股份有限公司 | 数据处理方法、装置、电子设备、介质及产品 |
US11907693B2 (en) | 2022-04-29 | 2024-02-20 | Zhejiang Lab | Job decomposition processing method for distributed computing |
-
2020
- 2020-03-05 CN CN202010147521.5A patent/CN111475516A/zh active Pending
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112181804A (zh) * | 2020-08-31 | 2021-01-05 | 五八到家有限公司 | 一种参数校验方法、设备以及存储介质 |
CN112181804B (zh) * | 2020-08-31 | 2023-09-08 | 五八到家有限公司 | 一种参数校验方法、设备以及存储介质 |
CN112799791A (zh) * | 2021-01-22 | 2021-05-14 | 平安普惠企业管理有限公司 | 分布式锁的调用方法、装置、电子设备和存储介质 |
CN113407553A (zh) * | 2021-05-14 | 2021-09-17 | 重庆锐云科技有限公司 | 一种分布式锁的实现方法、系统、设备及存储介质 |
CN113535762A (zh) * | 2021-07-14 | 2021-10-22 | 北京数码视讯支付技术有限公司 | 安全的账户代付方法和装置 |
CN113535762B (zh) * | 2021-07-14 | 2024-01-26 | 北京数码视讯支付技术有限公司 | 安全的账户代付方法和装置 |
CN114579183A (zh) * | 2022-04-29 | 2022-06-03 | 之江实验室 | 一种用于分布式计算的作业分解处理方法 |
US11907693B2 (en) | 2022-04-29 | 2024-02-20 | Zhejiang Lab | Job decomposition processing method for distributed computing |
CN115357626A (zh) * | 2022-09-06 | 2022-11-18 | 中国建设银行股份有限公司 | 数据处理方法、装置、电子设备、介质及产品 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111475516A (zh) | 分布式锁的调用方法、装置、计算机设备及存储介质 | |
CN112162965B (zh) | 一种日志数据处理的方法、装置、计算机设备及存储介质 | |
US8286194B2 (en) | Coupling state aware systems | |
CN111506386A (zh) | 虚拟机在线迁移方法、装置、设备及计算机可读存储介质 | |
CN112199442B (zh) | 分布式批量下载文件方法、装置、计算机设备及存储介质 | |
CN112631751A (zh) | 任务调度方法、装置、计算机设备及存储介质 | |
CN112631924A (zh) | 自动化测试方法、装置、计算机设备及存储介质 | |
CN111782304A (zh) | 分页加载数据逻辑控制方法、装置、计算机设备及介质 | |
CN114564294A (zh) | 智能服务编排方法、装置、计算机设备及存储介质 | |
CN115757492A (zh) | 一种热点数据的处理方法、装置、计算机设备及存储介质 | |
CN111651489A (zh) | 一种大数据处理服务器系统 | |
CN115794437A (zh) | 微服务的调用方法、装置、计算机设备及存储介质 | |
CN114281552A (zh) | 一种基于有向无环图的任务调度方法、装置、设备及介质 | |
CN113312135A (zh) | 一种列表展示方法、装置、计算机设备及存储介质 | |
CN110908644B (zh) | 状态节点的配置方法、装置、计算机设备和存储介质 | |
CN112860662A (zh) | 数据血缘关系建立方法、装置、计算机设备及存储介质 | |
WO2023193633A1 (zh) | 图像分析方法、装置、计算机设备以及存储介质 | |
CN107632893B (zh) | 消息队列处理方法及装置 | |
CN114968719A (zh) | 线程运行状态分类方法、装置、计算机设备及存储介质 | |
CN114238391A (zh) | 数据分页查询方法、装置、电子设备及存储介质 | |
CN114186976A (zh) | 工作流程流转方法、装置、计算机设备及存储介质 | |
CN112346879A (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
JPH08297573A (ja) | オブジェクトデータ処理装置 | |
CN114756180B (zh) | 覆盖写入数据块分配方法、装置、计算机设备及存储介质 | |
CN109547290B (zh) | 云平台垃圾数据检测处理方法、装置、设备及存储介质 |
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 |