分布式集群的并发处理方法及装置与流程

文档序号:22428309发布日期:2020-10-02 10:05阅读:344来源:国知局

本发明涉及分布式处理技术领域,具体涉及一种分布式集群的并发处理方法及装置。



背景技术:

在多线程并发的业务场景中,当多个线程同时操作一个公共变量时,需要通过加锁的方式对变量进行同步操作,保证多线程的操作能够线性执行,消除并发修改。

在单机系统中,通过规定在一个时刻同一个代码块只能有一个线程可执行处理多线程并发,即在代码块中添加锁的标记,以保证每个线程都能看到添加的锁标记。当后续线程发现代码块中已经有锁标记时,需要等待拥有锁标记的线程结束,同步代码块取消锁标记后再去尝试设置新的锁标记。

分布式系统与单机系统最大的不同在于其不是多线程而是多进程。多线程由于可以共享堆内存,因此可以简单的采取内存作为锁标记存储位置。但多进程之间可能都不在同一台物理机上,此时无法简单地通过内存设置锁标记。因此,如何应对分布式系统中的多线程并发情况,成为本领域技术人员亟待解决的问题。



技术实现要素:

因此,本发明要解决的技术问题在于克服现有技术中的上述缺陷,从而提供一种能够可靠处理分布式系统中的多线程并发情况的方案。

为此,根据本发明第一方面,提供了一种分布式集群系统的并发处理方法,包括:

获得业务访问请求,构造与所述业务访问请求相对应的并发锁;

获取所述并发锁的锁信息;

根据所述锁信息确定是否允许所述业务访问请求;

在允许所述业务访问请求的情况下,修改所述并发锁的锁信息。

示例性地,所述响应于业务访问请求,构造与所述业务访问请求相对应的并发锁的步骤包括:

基于所述业务访问请求中的接口参数,通过freemarker基于@synchronized注解的方式构造与所述业务访问请求相对应的并发锁。

示例性地,所述获取所述并发锁的锁信息的步骤包括:

从redis数据库中获取所述并发锁的占用信息和超时信息;所述占用信息表征要访问的当前业务是否已被其它并发锁占用,所述超时信息表征所述其它并发锁占用所述当前业务的时间是否已经超过预设阈值。

示例性地,所述锁信息包括占用信息和超时信息,所述根据所述锁信息确定是否允许所述业务访问请求的步骤包括:

若所述占用信息表征要访问的当前业务未被其它并发锁占用,则允许所述业务访问请求;

若所述占用信息表征要访问的当前业务已被其它并发锁占用,判断所述超时信息是否已经超出所述预设阈值;

若否,拒绝所述业务访问请求;若是,允许所述业务访问请求。

示例性地,所述修改所述并发锁的锁信息的步骤包括:

将所述当前业务的占用信息修改为已被占用;

根据所述预设阈值修改所述超时信息。

示例性地,所述修改所述并发锁的锁信息的步骤还包括:

当所述当前业务的访问结束时,将所述当前业务的占用信息修改为未被占用;以及

当在所述当前业务的访问过程中出现异常时,将所述当前业务的占用信息修改为未被占用。

示例性地,所述方法还包括:

通过setnx()函数获取所述并发锁的锁信息,确定与所述业务访问请求相对应的业务资源是否已经被占用;

响应于与所述业务访问请求相对应的业务资源已经被占用,通过getset()函数获取第一超时信息;

响应于所述第一超时时间早于当前时间,允许通过当前并发锁占用与所述业务访问请求相对应的业务资源;

计算与所述当前并发锁对应的重置超时信息;

通过getset()函数获取第二超时信息,比较所述第二超时信息与所述重置超时信息是否相等;如相等,确定允许所述业务访问请求。

根据本发明第二方面,提供了一种分布式集群系统的并发处理装置,包括:

并发锁构造模块,适用于响应于业务访问请求,构造与所述业务访问请求相对应的并发锁;

锁信息获取模块,适用于获取所述并发锁的锁信息;

访问请求确定模块,适用于根据所述锁信息确定是否允许所述业务访问请求;

锁信息修改模块,适用于在允许所述业务访问请求的情况下,修改所述并发锁的锁信息。

根据本发明第三方面,提供了一种计算机设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。

根据本发明第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。

与现有技术相比,本发明具有如下有益效果:

(1)本发明提供的分布式集群系统的并发处理方法及处理装置,基于业务访问请求自动构造相应的并发锁,通过获取的锁信息确定是否允许业务访问请求。这样就可以实现在分布式集群系统中线性处理并发请求,避免造成请求冲突。

(2)本发明使用freemarker根据接口参数自动生成并发锁。freemarker本身是一款基于模板的、用来生成/输出文本的通用工具。通过freemarker在模板内部只专注于如何展现数据,而在模板外部可以专注于要展示什么数据。这样,可以简便、准确地根据不同地接口参数生成对应地并发锁,提高系统开发效率。

(3)本发明通过设置超时时间来规定一个进程访问特定业务的时限,超过时限自动释放并行锁,从而避免死锁,防止单一进程长时间访问业务而使其它进程无法访问的情况。

附图说明

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

图1示出了本发明实施例1中分布式集群系统的并发处理方法的一个具体示例的流程图;

图2示出了本发明实施例1中通过freemarker构造并行锁的过程示意图;

图3示出了根据本发明实施例1利用redis数据库自带的setnx()、get()和getset()方法构造分布式并发锁的示意性流程图;

图4示出了本发明实施例2中分布式集群系统的并发处理装置的原理框图;

图5示出了本发明实施例2中分布式集群系统的并发处理装置的硬件结构示意图。

具体实施方式

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

在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。

在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,还可以是两个元件内部的连通,可以是无线连接,也可以是有线连接。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。

此外,下面所描述的本发明不同实施方式中所涉及的技术特征只要彼此之间未构成冲突就可以相互结合。

实施例1

请参阅图1,本实施例提供一种分布式集群系统的并发处理方法,包括以下步骤:

s100:响应于业务访问请求,构造与所述业务访问请求相对应的并发锁。

分布式集群系统是由一组相互独立的、通过高速网络互联的计算机集群共同组成的大型分布式系统,每台计算机作为分布式集群系统中的一个节点承担各自对应的功能。例如在某电商系统中,其中一个节点a负责处理积分兑换礼品的业务,该节点a会接收到大量来自客户端的业务访问请求。本实施例用于解决节点a同时处理多个并发的业务访问请求的情况。

可以理解,每个业务访问请求具有相应的接口参数,该接口参数一般与用户账户或者要访问的业务类型有关。本步骤针对每一个客户端发出的业务访问请求,构造业务访问请求相对应的并发锁,该并发锁中包含了要访问的接口参数信息。并发锁用于限制某一类业务一次只允许一个进程访问。通过设置并发锁,可以在某业务资源没有被占用的情况下,允许当前业务访问请求独占该业务资源;或者在某业务资源已经被占用的情况下,禁止当前业务访问请求独占该业务资源。

s200:获取所述并发锁的锁信息,所述锁信息用于表征与所述业务访问请求相对应的业务资源是否被占用。

并发锁的锁信息可以通过二进制数字来表示,例如,可以用1代表与所述业务访问请求相对应的业务资源没有被占用,用0代表与所述业务访问请求相对应的业务资源已经被占用。

本实施例中所述占用,指的是被除当前业务访问请求之外的其它任何请求占用。例如,假设当前业务访问请求是由进程a发起的,那么由除进程a之外的进程b、进程c、进程d等发起的业务访问请求就是其它请求。

除了表征与所述业务访问请求相对应的业务资源是否被占用之外,锁信息还可以具有其它附加功能,本发明会在后文中进一步描述。

s300:根据所述锁信息确定是否允许所述业务访问请求。

本步骤通过锁信息的具体数值来确定是否允许所述业务访问请求。例如,当锁信息返回的数值为1时,表明与所述业务访问请求相对应的业务资源没有被占用,则此时允许所述业务访问请求;当锁信息返回的数值为0时,表明与所述业务访问请求相对应的业务资源已经被占用,则此时拒绝所述业务访问请求。

s400:在允许所述业务访问请求的情况下,修改所述并发锁的锁信息。

可以理解,当前业务访问请求被允许,意味着与所述业务访问请求相对应的业务资源已被当前业务访问请求所占用。为了告知其它业务访问请求当前业务资源已被占用,则需要修改并发锁的锁信息,例如将锁信息的返回值从1修改为0。这样,当其它业务访问请求想要访问当前业务资源时,其获取到的锁信息会表征该业务资源已经被占用而拒绝其访问。

示例性地,本实施例中与所述业务访问请求相对应的并发锁是通过freemarker构造的。freemarker是一款基于模板的、用来生成/输出文本的通用工具。在freemarker模板中编程人员可以专注于如何展现数据,而在freemarker模板之外可以专注于要展示什么数据。

图2示出了通过freemarker构造并行锁的过程示意图。如图2所示,freemarker通过引用接口参数中templatekey和javaobjects各自包含的具体数值,生成对应的outputkey,即本实施例中的并行锁。进一步,本实施例中的并行锁是基于@synchronized注解的方式通过声明构造的。声明式最大的优点就是不需要通过编程的方式管理分布式锁,这样就不需要在业务逻辑代码中掺杂管理的代码,通过基于@synchronized注解的方式,便可以将分布式锁规则应用到业务逻辑中。声明式使业务代码不受污染,一个普通的pojo对象,只要加上注解就可以获得完全的分布式锁支持。

需要说明的是,对于一个业务访问请求,可以基于不同维度构造多个并发锁。例如对于积分兑换礼品的应用场景中,规定可以兑换手机、手环、体脂秤三种礼品。从礼品维度来看,同一种礼品一次只能由一个用户兑换;从用户角度来看,同一个用户一次只能兑换一种礼品。因此本实施例中可以基于礼品维度构造并发锁,也可以基于用户维度构造并发锁。

示例性地,步骤s200中获取所述并发锁的锁信息的步骤包括:

从redis数据库中获取所述并发锁的占用信息和超时信息;所述占用信息表征要访问的当前业务是否已被其它并发锁占用,所述超时信息表征所述其它并发锁占用所述当前业务的时间是否已经超过预设阈值。

redis数据库为缓存数据库,其能够处理海量数据,执行效率高,具有高负载访问能力。本实施例用redis数据库作为锁信息的存储空间,可以支持分布式集群系统中的大量高并发进程,实现快速响应。

如前所述,并发锁是根据业务访问请求中包含的接口参数来构造的。因此可以以接口参数作为关键字在redis数据库中进行查询。如果能查询到与上述接口参数相对应的并发锁,说明已有其它进程正在访问相应的业务资源并添加了并发锁。如果不能查询到与上述接口参数相对应的并发锁,说明目前没有其他进程正在访问相应的业务资源。

本实施例中的锁信息包含占用信息和超时信息两部分,其中占用信息表征要访问的当前业务是否已被其它并发锁占用,例如前文中所述的返回值1或0。超时信息则用来规定一个进程可占用业务资源的最长时间,例如设置为60秒。一般来说,超时信息可以用过期时刻来表示,即开始访问业务资源的时刻+最长访问时间,例如开始访问业务资源的时刻为12:00:00,以可占用业务资源的最长时间为60秒进行设置,那么相应的过期时刻为12:01:00。

通过设置超时信息,可以获取当前业务资源被当前业务访问请求占用的时长,当占用的时长超出阈值时可以自动释放当前并发锁,拒绝当前业务访问请求继续占用业务资源,从而避免发生死锁,有利于其它进程共享业务资源。

示例性地,步骤s300中根据所述锁信息确定是否允许所述业务访问请求的步骤包括:

若所述占用信息表征要访问的当前业务已被其它并发锁占用,判断所述超时信息是否已经超出所述预设阈值;

若否,拒绝所述业务访问请求;若是,允许所述业务访问请求。

如前所述,可以以接口参数作为关键字从redis数据库中查询包含该关键字的并发锁。如果能查询到,当前业务已被其它并发锁占用;如果不能查询到,说明当前业务未被其它并发锁占用。因此,本示例中的占用信息反应的就是能否从redis数据库中查询到相应的并发锁的情况。

示例性地,步骤s400在允许所述业务访问请求的情况下,所述修改所述并发锁的锁信息的步骤包括:

将所述当前业务的占用信息修改为已被占用;

将所述当前业务的超时信息修改为自当前时刻起增加所述预设阈值之后的时刻。

在当前业务访问请求被允许访问相应的业务资源的基础上,本示例用于基于当前业务访问请求修改锁信息。锁信息可以包含两部分,一部分是占用信息,另一部分是超时信息。通过将占用信息修改为已被占用,禁止其它进程的业务访问请求访问相应的业务资源。通过修改超时时间,用于设置当前业务访问请求访问当前业务资源的最长时间。例如,将占用信息的数值从1修改为0,并添加超时信息,例如上文中的12:01:00。

修改后的并发锁信息会存储到redis数据库中,以便下次有其它进程想要访问时,可以从redistribution数据库中直接查询到与当前业务访问请求相对应的并发锁信息。

示例性地,步骤s400中修改所述并发锁的锁信息的步骤还包括:

当所述当前业务的访问结束时,将所述当前业务的占用信息修改为未被占用;以及

当在所述当前业务的访问过程中出现异常时,将所述当前业务的占用信息修改为未被占用。

本示例用于在合适的条件下释放并发锁,其中合适的条件可以包括对当前业务资源的访问结束,或者在访问过程中出现异常。对于当前业务资源的访问结束的情况,尽快释放并发锁,有利于其它进程继续访问业务资源,提升系统执行效率。对于在访问过程中出现异常的情况,通过及时释放并发锁,可以避免异常过程中出现死锁,有利于及时消除异常状况。在本示例中,释放并发锁通过修改占用信息来实现,例如从redistribution数据库中删除原有的并发锁。

图3示出了根据本发明实施例1利用redis数据库自带的setnx()、get()和getset()方法构造分布式并发锁的示意性流程图。setnx()、get()和getset()方法为redis数据库本身自带的方法。其中,setnx()的含义就是setifnotexists,其主要有两个参数setnx(key,value),其中key代表当前要访问的业务资源相对应的并发锁。如果key不存在,则说明没有任何进程访问当前业务资源,允许当前业务访问请求对当前业务资源访问,设置当前key成功,返回1;如果当前key已经存在,则说明有进程正在访问当前业务资源,因此不允许当前业务访问请求对当前业务资源访问,设置当前key失败,返回0。

getset(key,newvalue),对key设置newvalue这个值,并且返回key原来的旧值。假设key原来是不存在的,那么多次执行这个命令,会出现下边的效果:getset(key,“value1”)返回null此时key的值会被设置为value1;getset(key,“value2”)返回value1此时key的值会被设置为value2,依次类推。

根据图3所示,setnx()、get()和getset()方法构造分布式并发锁的步骤具体如下所述:

(1)setnx(lockkey,当前时间+过期超时时间),如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向下一步。

(2)get(lockkey)获取值oldexpiretime,可以将其称为第一超时信息。将第一超时信息对应的value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向下一步。

(3)计算newexpiretime=当前时间+过期超时时间,可以将其称为重置超时信息,用于表征当前并发锁经过重置后对应的过期时间。然后通过getset(lockkey,newexpiretime)会返回当前lockkey的值currentexpiretime,称为第二超时信息。

(4)判断currentexpiretime与oldexpiretime是否相等,即判断重置超时信息与第二超时信息是否相等。如果相等,说明当前getset设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。

(5)在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行delete释放锁;如果大于锁设置的超时时间,则不需要再进行处理。

综上所述,本发明提供的分布式集群系统的并发处理方法及处理装置,基于业务访问请求自动构造相应的并发锁,通过获取的锁信息确定是否允许业务访问请求。这样就可以实现在分布式集群系统中线性处理并发请求,避免造成请求冲突。

实施例2

本施例提供一种分布式集群系统的并发处理装置40,如图4所示,包括并发锁构造模块41、锁信息获取模块42、访问请求确定模块43和锁信息修改模块44。其中:

并发锁构造模块41适用于响应于业务访问请求,构造与所述业务访问请求相对应的并发锁;

锁信息获取模块42适用于获取所述并发锁的锁信息,所述锁信息用于表征与所述业务访问请求相对应的业务资源是否被占用;

访问请求确定模块43适用于根据所述锁信息确定是否允许所述业务访问请求;

锁信息修改模块44适用于在允许所述业务访问请求的情况下,修改所述并发锁的锁信息。

上述装置基于业务访问请求自动构造相应的并发锁,通过获取的锁信息确定是否允许业务访问请求。这样就可以实现在分布式集群系统中线性处理并发请求,避免造成请求冲突。

实施例3

本实施例还提供一种计算机设备,如可以执行程序的智能手机、平板电脑、笔记本电脑、台式计算机、机架式服务器、刀片式服务器、塔式服务器或机柜式服务器(包括独立的服务器,或者多个服务器所组成的服务器集群)等。本实施例的计算机设备50至少包括但不限于:可通过系统总线相互通信连接的存储器51、处理器52,如图5所示。需要指出的是,图5仅示出了具有组件51-52的计算机设备50,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。

本实施例中,存储器51(即可读存储介质)包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘等。在一些实施例中,存储器51可以是计算机设备50的内部存储单元,例如该计算机设备50的硬盘或内存。在另一些实施例中,存储器51也可以是计算机设备50的外部存储设备,例如该计算机设备50上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。当然,存储器51还可以既包括计算机设备50的内部存储单元也包括其外部存储设备。本实施例中,存储器51通常用于存储安装于计算机设备50的操作系统和各类应用软件,例如实施例二的并发处理装置400的程序代码等。此外,存储器51还可以用于暂时地存储已经输出或者将要输出的各类数据。

处理器52在一些实施例中可以是中央处理器(centralprocessingunit,cpu)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器22通常用于控制计算机设备50的总体操作。本实施例中,处理器52用于运行存储器51中存储的程序代码或者处理数据,例如运行分布式集群系统的并发处理装置400,以实现实施例一的分布式集群系统的并发处理方法。

实施例4

本实施例还提供一种计算机可读存储介质,如闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘、服务器、app应用商城等等,其上存储有计算机程序,程序被处理器执行时实现相应功能。本实施例的计算机可读存储介质用于存储分布式集群系统的并发处理装置400,被处理器执行时实现实施例一的分布式集群系统的并发处理方法。

显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。

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