掌桥专利:专业的专利平台
掌桥专利
首页

业务处理方法、电子设备及计算机可读存储介质

文献发布时间:2023-06-19 11:05:16


业务处理方法、电子设备及计算机可读存储介质

技术领域

本申请涉及计算机技术领域,尤其是涉及一种业务处理方法、电子设备及计算机可读存储介质。

背景技术

在很多互联网技术应用场景中,为了保证数据的一致性,需要很多的技术方案来支持,比如采用分布式锁。分布式锁是控制分布式系统之间同步访问共享资源的一种方式,在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰以保证一致性,在这种情况下,便需要使用到分布式锁。

目前常用的分布式锁的生成方式包括JDK(Java Development Kit,Java语言的软件开发工具包)自带的AQS(AbstractQueuedSynchronizer,抽象的队列式同步器)机制,JAVA中自带的AQS抽象及各衍生应用锁实现,底层依赖操作系统实现原子操作和线程同步,在内存中维护同步锁的线程同步队列,并基于AQS实现了可重入锁、读写锁、信号量等具体应用级锁,但这种方式只能在JVM中使用,无法用于解决分布式系统对共享资源的锁问题;另一种则是通过中间服务提供锁状态管理,在数据库或分布式缓存中保存锁的信息,由外部应用进行获取并设置锁状态,当锁被占用时候则应用获取锁失败,应用通过轮询方式获取锁,但这种方式只能用于简单的分布式锁应用场景,且需要通过轮询的方式获取占用锁,效率性能低下。

发明内容

本申请旨在至少解决现有技术中存在的技术问题之一。为此,本申请提出一种业务处理方法,能够高效地对不同业务分配对应的锁,从而解决分布式系统中共享资源的分配问题,提高业务处理的效率。

本申请还提出一种具有上述业务处理方法的电子设备。

本申请还提出一种具有上述业务处理方法的计算机可读存储介质。

根据本申请的第一方面实施例的业务处理方法,包括:获取客户端上传的业务处理请求;

根据所述业务处理请求确定所述业务处理请求对应的同步队列;

根据所述同步队列配置所述业务处理请求对应的同步锁;

根据所述同步锁生成业务响应;

将所述业务响应发送给所述客户端,以使所述客户端根据所述业务响应进行业务处理。

根据本申请实施例的业务处理方法,至少具有如下有益效果:通过获取客户端上传的用于请求业务处理的业务处理请求,根据业务处理请求确定业务处理对应的同步队列,根据同步队列配置业务处理请求对应的同步锁,根据同步锁生成业务响应后发送给客户端,以使客户端根据业务响应进行业务处理,能够高效地对不同业务分配对应的锁,从而解决分布式系统中共享资源的分配问题,提高业务处理的效率。

根据本申请的一些实施例,所述根据所述同步队列配置所述业务处理对应的同步锁,还包括:

获取所述同步队列中的多个队列请求;

基于所述多个队列请求的队列顺序和所述同步锁的资源数量对所述队列请求进行队列处理;

根据所述队列处理的处理结果配置所述业务处理请求对应的同步锁。

根据本申请的一些实施例,还包括:

获取所述客户端进行业务处理后返回的执行结果;

根据所述执行结果释放所述业务处理请求配置的同步锁,并移除所述同步队列中的所述业务处理请求。

根据本申请的一些实施例,还包括:

若所述业务处理请求与所述同步队列中的队列请求相同,则为所述业务处理请求增设重入标识;

根据所述重入标识为所述业务处理请求和相同的所述队列请求配置同一所述同步锁;

根据所述同一同步锁对所述业务处理请求和相同的所述队列请求进行队列处理。

根据本申请的一些实施例,还包括:获取所述业务处理请求的顺序标识;根据所述顺序标识调整所述业务处理请求在所述同步队列中的队列顺序。

根据本申请的一些实施例,所述根据所述队列处理的处理结果配置所述业务处理请求对应的同步锁,包括:

对配置有所述同步锁的队列请求进行队列处理后,移除所述队列请求;

获取移除所述队列请求后的所述同步队列中的队列数量;

根据所述队列数量将所述业务处理请求加入所述同步队列中;

基于所述业务处理请求在所述同步队列中的队列顺序,对所述业务处理请求配置对应的同步锁。

根据本申请的一些实施例,还包括:

获取客户端基于预设周期上传的存活标识,所述存活标识用于标识所述客户端的请求状态;

根据所述存活标识获取所述同步队列中对应的业务处理请求;

判断所述业务处理请求的请求状态与所述客户端的请求状态是否相同;

若所述业务处理请求的请求状态与所述客户端的请求状态不相同,则判断所述业务处理请求是否配置有同步锁;

若所述业务处理请求配置有同步锁,则释放所述业务处理请求配置的同步锁,并移除所述同步队列中的所述业务处理请求。

根据本申请的一些实施例,还包括:

发送检测请求给客户端;

获取所述客户端根据所述检测请求返回的存活标识;

根据所述存活标识获取所述同步队列中对应的业务处理请求;

判断所述业务处理请求的请求状态与所述客户端的请求状态是否相同;

若所述业务处理请求的请求状态与所述客户端的请求状态不相同,则判断所述业务处理请求是否配置有同步锁;

若所述业务处理请求未配置同步锁,则移除所述同步队列中的所述业务处理请求。

根据本申请的第二方面实施例的电子设备,包括:至少一个处理器,以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器执行所述指令时实现如第一方面所述的业务处理方法。

根据本申请的电子设备,至少具有如下有益效果:通过执行第一方面实施例中提到的业务处理方法,能够高效地对不同业务分配对应的锁,从而解决分布式系统中共享资源的分配问题,提高业务处理的效率。

根据本申请的第三方面实施例的计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如第一方面所述的业务处理方法。

根据本申请的计算机可读存储介质,至少具有如下有益效果:通过执行第一方面实施例中提到的业务处理方法,能够高效地对不同业务分配对应的锁,从而解决分布式系统中共享资源的分配问题,提高业务处理的效率。

本申请的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本申请的实践了解到。

附图说明

图1为本申请实施例中业务处理方法中服务器的一具体模块示意图;

图2为本申请实施例中业务处理方法中的一具体流程示意图;

图3为本申请实施例中业务处理方法中步骤S300的一具体流程示意图;

图4为本申请实施例中业务处理方法中同步队列的一具体应用实例图;

图5为本申请实施例中业务处理方法中步骤S330的一具体流程示意图;

图6为本申请实施例中业务处理方法中获取独享锁的第一具体应用实例图;

图7为本申请实施例中业务处理方法中获取独享锁的第二具体应用实例图;

图8为本申请实施例中业务处理方法中获取独享锁的第三具体应用实例图。

附图标记:

核心控制模块100、组件模块200、存储模块300、配置模块400、管理模块500。

具体实施方式

下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能理解为对本申请的限制。

需要说明的是,在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同流程图中的顺序执行所示出或描述的步骤。如果涉及到“若干”,其含义是一个以上,如果涉及到“多个”,其含义是两个以上,如果涉及到“以下”,均应理解为包括本数。本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本申请的实施例,并且除非另外要求,否则不会对本申请的范围施加限制。大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到第一、第二只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。

需要说明的是,如无特殊说明,在实施例中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本申请。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的组合。

在很多互联网技术应用场景中,我们为了保证数据的一致性,需要很多的技术方案来支持,比如分布式锁。分布式锁是控制分布式系统之间同步访问共享资源的一种方式,在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰以保证一致性,在这种情况下,便需要使用到分布式锁。

目前常用的分布式锁的生成方式包括JDK(Java Development Kit,Java语言的软件开发工具包)自带的AQS(AbstractQueuedSynchronizer,抽象的队列式同步器)机制,JAVA中自带的AQS抽象及各衍生应用锁实现,底层依赖操作系统实现原子操作和线程同步,在内存中维护同步锁的线程同步队列,并基于AQS实现了可重入锁、读写锁、信号量等具体应用级锁,但这种方式只能在JVM中使用,无法用于解决分布式系统对共享资源的锁问题;另一种则是通过中间服务提供锁状态管理,在数据库或分布式缓存中保存锁的信息,由外部应用进行获取并设置锁状态,当锁被占用时候则应用获取锁失败,应用通过轮询方式获取锁,但这种方式只能用于简单的分布式锁应用场景,且需要通过轮询的方式获取占用锁,效率性能低下。

基于此,本申请实施例提供了一种业务处理方法、电子设备及计算机可读存储介质,能够高效地对不同业务分配对应的锁,从而解决分布式系统中共享资源的分配问题,提高业务处理的效率。

第一方面,本申请实施例提供了一种业务处理方法。

需要说明的是,本申请实施例中所提到的业务处理方法是基于如图1所示的服务器所进行的,包括:组件模块200、核心控制模块100、存储模块300、配置模块400、管理模块500。

其中组件模块200是集成于客户端的应用程序中的组件,与核心控制模块100基于API接口进行连接,客户端根据应用程序需要处理的具体业务向核心控制模块100请求获取同步锁或者释放同步锁。

核心控制模块100负责对所有同步锁的操作逻辑的处理;核心控制模块100集成有多个内部子模块,其中内部子模块包括:客户端API模块,用于与组件模块200进行API(Application Programming Interface,应用程序编程接口)接口调用;管理API模块,用于与管理模块500进行API接口调用;同步控制模块负责对同步锁的同步队列进行管理和调度;监控子模块用于对客户端的心跳监控和失效线程的资源清理等;映射模块用于实现同步队列在核心控制模块100和存储模块300之间的映射管理;配置模块400用于实现对不同配置数据库的适配,例如Oracle、Mysql、Nacos、SpringCloudConfig等配置数据库。

存储模块300通过使用Redis(Remote Dictionary Server,远程字典服务)中间件保存同步队列的相关信息,并且具备Redis的单线程特性,集成有Lua脚本以实现CAS(Compare And Set)原子操作,其中CAS原子操作是解决多线程并行情况下使用锁造成性能损耗的一种机制,采用这种无锁的原子操作可以实现线程安全,避免加锁的笨重性。

配置模块400用于存储同步锁的配置信息,以便基于同步锁的配置信息对业务处理请求进行同步锁的配置。

管理模块500用于对同步锁的进行管理,例如对同步锁的增删查改、手动加解锁等,具体通过调用核心控制模块100的管理API模块进行操作。

在一些实施例中,参照图2,示出了本申请实施例中业务处理方法的流程示意图。其具体包括步骤:

S100,获取客户端上传的业务处理请求;

S200,根据业务处理请求确定业务处理对应的同步队列;

S300,根据同步队列配置业务处理请求对应的同步锁;

S400,根据同步锁生成业务响应;

S500,将业务响应发送给客户端,以使客户端根据业务响应进行业务处理。

在步骤S100中,当客户端在需要资源进行业务处理时,会生成相应的业务处理请求,该业务处理请求用于向服务器请求分配业务处理所需要的资源,即对应的线程需要获取业务资源进行处理,每一个业务处理请求代表线程请求执行相应的业务处理。具体地说,客户端通过调用组件模块200中的组件函数,以通过组件模块200与核心控制模块100对接的API接口上传业务处理请求,用于向核心控制模块100请求业务处理所需要的资源分配。

在实际应用中,服务器可以对接若干个客户端,每一个客户端作为一个线程分别向服务器访问处理相关业务所需要的资源,而服务器中的核心控制模块100基于对应的业务处理请求进行资源分配,以使得若干个客户端线程能够在资源合理分配的同时高效地进行业务处理,以避免资源的抢占导致资源分配不均的问题。在步骤S200中,当获取到客户端上传的业务处理请求中,可以根据业务处理请求所要请求处理的具体业务类型,确定业务处理对应的同步队列。需要说明的,在服务器中,核心控制模块100与存储模块300中通过映射模块进行对接,存储模块300中存储有若干个业务处理的同步队列的相关信息,而核心控制模块100通过映射模块即可获取到存储模块300中存储的同步队列的队列信息。每一个同步队列代表一个业务类型的分布式线程集合,同步队列的队列信息的更新依赖于Redis的单线程特性和Lua脚本实现CAS原子性操作。

在步骤S300中,根据当前同步队列的队列信息配置业务处理所对应的同步锁,即为客户端的业务处理请求配置同步锁。需要说明的是,当业务处理请求配置上同步锁时,代表当前客户端已获得进行业务处理所需要的资源,此时客户端即可执行相应的业务处理流程。

在一些实施例中,如图3所示,步骤S300中,具体包括步骤:

S310,获取同步队列中的若干个队列请求;

S320,基于若干个队列请求的队列顺序和同步锁的资源数量对队列请求进行队列处理;

S330,根据队列处理的处理结果配置业务处理请求对应的同步锁。

在步骤S310中,获取当前业务所对应的同步队列中的若干个队列请求。其中队列请求是指其他客户端在先请求的线程节点,并且该请求已在同步队列中进行排队,等待对其进行队列处理。每一个线程节点代表客户端上传的一个业务处理任务,表示客户端所需要请求的业务资源。需要说明的是,一个同步队列里面在某一时间段内可能存在多个队列请求,也可能不存在任意一个队列请求。

在步骤S320中,根据当前同步队列中的若干个队列请求的队列顺序和同步中所分配到的同步锁的资源数量,对队列请求进行队列处理。其中,队列顺序指队列请求在同步队列中依据请求的优先级顺序进行排队,根据队列请求自身分配到的队列顺序等待为其分配对应的同步锁,或者对配置有同步锁的队列请求进行处理。需要说明的是,一个同步队列中所分配到的同步锁的资源数量是根据实际的资源供应量进行分配的,根据分配的同步锁的资源数量不同,定义不同的同步锁类型,例如独享锁和共享锁。其中独享锁是指当前同步队列中分配到的同步锁的资源数量只有一个,即只存在一个同步锁,当前处理业务的业务资源只允许进行单线程的业务处理;共享锁是指当前同步队列中分配到的同步锁的资源数量至少两个以上,即存在至少两个以上的同步锁,当前处理业务的业务资源允许同时进行至少两个以上的业务处理。

在可能实施的应用实例中,如图4所示,以具备多个同步锁的同步队列为例,同步队列中包含多个线程节点即多个队列请求,其中线程节点基于优先级顺序在队列请求中进行排序,其中优先级最高的并且已经获取到同步锁的线程节点为头节点,优先级最低的线程节点则为尾节点;后续的线程节点根据队列顺序排列在同步队列中,并且根据队列顺序以及同步队列所拥有的同步锁的资源数量为在先的线程节点分配同步锁。“Locked”代表当前线程节点已配置有同步锁;“Waiting”代表当前线程节点未配置有同步锁;“前节点”表示当前线程节点的前一节点的标识号;“后节点”表示当前线程节点的后一节点的标识号。

在一些实施例中,当业务处理请求中存在顺序标识时,可以根据顺序标识调整业务处理请求在同步队列中的队列顺序。其中顺序标识用于标识业务处理请求在同步队列中的具体位置,例如在某一队列请求之前或某一队列请求之后,顺序标识能够确定业务处理请求的优先级顺序,从而将业务处理请求排列到同步队列中其他队列请求之前。需要说明的是,同步队列中的队列请求在未进到同步队列中进行队列处理时,同样可以增设顺序标识,以使其能够调整对应的优先级顺序。

在实际应用中,一个同步队列所能容纳的队列请求的队列数量是有限的即最大队列数量,当同步队列中的队列请求已达到最大队列数量时,则无法继续新增队列请求,需要等待在先的队列请求完成相应的业务处理即可新增队列请求。

其中每一个线程节点中所包含的信息及相关解释,如下表1所示:

表1

其中,重入标识是指当前同步队列中了某一队列请求已分配有独享锁时,此时客户端上传的新的业务处理请求与该队列请求为同一业务处理的请求时,则为业务处理请求增设重入标识,确定业务处理请求为重复的业务处理请求,能够根据重入标识为业务处理请求配置与在先的队列请求相同的独享锁,从而能够根据相同的独享锁分别对在先的队列请求和业务处理请求进行队列处理,等待业务处理请求锁对应的业务处理完毕后,释放该独享锁,即可将新的独享锁分配给同步队列中的其他队列请求,当其他队列请求被分配到独享锁时,即可分配业务资源给对应的客户端以执行对应的业务。

在步骤S330中,当同步队列中在先的已分配同步锁的队列请求根据队列顺序进行队列处理后,会在完成相应的业务处理后,释放自身分配到的同步锁,将该同步锁传递给在后的其他队列请求,循环该流程,直至位于业务处理请求前的队列请求完成业务处理后释放同步锁,同步队列会将释放的同步锁重新配置给业务处理请求。

在一些实施例中,参考图5,步骤S330中具体还包括步骤:

S331,对配置有同步锁的队列请求进行队列处理后,移除队列请求;

S332,获取移除队列请求后的同步队列中的队列数量;

S333,根据队列数量将业务处理请求加入同步队列中;

S334,基于业务处理请求在同步队列中的队列顺序,对业务处理请求配置对应的同步锁。

在步骤S331中,当在先的已配置有同步锁的队列请求会优先进行队列处理,并在完成队列处理后,移除该队列请求。其中队列处理是指当队列请求配置了同步锁后会告知队列请求所对应的客户端执行相应的业务处理。需要说明的是,基于同步队列所拥有的同步锁的资源数量,确定当前同步队列中同时进行队列处理的队列请求的数量,例如同步锁的资源数量为两个时,则当前同步队列中的两个队列请求可同时分配到对应的同步锁,队列请求对应的客户端分别进行对应的业务处理。当队列请求对应的业务完成后,对应的客户端会发送完成业务的通知给业务处理系统,业务处理系统到客户端完成业务的通知后,即可释放在先的队列请求中配置的同步锁并移除同步队列中的队列请求,后续的同步队列则向前排序。

在步骤S332中,当同步队列中已配置有同步锁的队列请求完成队列处理后并被移除,此时需要获取当前同步队列的队列数量。需要说明的是,一个同步队列由于资源可用性的问题,会存在最大的队列数量,并且当同步队列中的队列请求已达到最大队列数量时,其他需要处理的在先的请求需要在同步队列外进行排队等待,等待同步队列中的队列数量是否减少,此时可以根据减少的队列数量将等待处理的其他请求新增至同步队列中进行队列处理。

在步骤S333和步骤S334中,当同步队列的队列数量减少,并且恰好轮询到业务处理请求时,则可以将业务处理请求移送至同步队列中等待进行队列处理。根据业务处理请求在同步队列中的队列顺序,对业务处理请求配置对应的同步锁,具体地说,依次对业务处理请求前的队列请求进行队列处理,当业务处理请求前的队列请求完成队列处理后,即可将释放的同步锁配置到业务处理请求。需要说明的是,若该同步锁为独享锁,则一次只能配置给一个请求,即只能处理单个队列请求,该队列请求则为同步队列中的头节点,当头结点的请求完成队列处理后,即可将同步锁配置到下一队列请求;若该同步锁为共享锁,则一次只能配置给多个请求,即能同时处理多个队列请求,这些队列请求则为同步队列中的头节点和头结点后的一定数量的线程节点,当头结点的请求完成队列处理后,即可将同步锁配置到未配置同步锁的优先级最高的队列请求。

在可能实施的应用实例中,以获取独享锁为例进行说明,参考图6、图7和图8,客户端请求获取业务资源即需要与其他客户端竞争资源,此时部署在客户端处的组件模块200会阻塞客户端当前的线程,并将客户端当前线程对应的业务处理请求上传至核心控制模块100,核心控制模块100获取到存储模块300中对应的同步队列信息,核心控制模块100对同步队列中的队列信息进行队列处理后,判断当前同步队列是否为空,如果当前同步队列为空,则将业务处理请求对应的线程节点加入同步队列中,并且作为头节点,根据头节点更新同步队列的队列数据对其分配对应的同步锁即独享锁,并且返回成功获取同步锁的业务相应给组件模块200,组件模块200接收到业务响应后,会根据业务响应解除对客户端当前线程的阻塞,客户端获取到业务响应后即可进行对应的业务处理;如果当前同步队列请求不为空,则判断当前线程节点是否已经在同步队列中占用了同步锁,如果占用了同步锁,则判断当前线程节点占用的同步锁是否支持重入即是否支持重复获取,若不支持重入,则返回不可重复获取通知,并且该通知也为成功获取锁的业务响应给组件模块200,组件模块200接收到业务响应后,会根据业务响应解除对客户端当前线程的阻塞,客户端获取到业务响应后即可进行对应的业务处理;如果当前线程节点支持重入,则为此线程节点的重入标识加1,同步队列需要执行重入标识对应的队列处理以进行节点数据更新,并且将重入标识且该重入标识也可以作为业务响应返回给给组件模块200,组件模块200接收重入标识后,会根据重入标识解除对客户端当前线程的阻塞,客户端获取到业务响应后即可进行对应的业务处理。

参考图7,若线程节点未占用同步锁,则判断客户端是否只是尝试获取锁,若客户端是尝试获取同步锁,则返回获取失败通知给组件模块200,组件模块200获取失败通知后解除对线程的阻塞,客户端即可按照未成功获取到锁来执行相应的逻辑处理;若客户端不是尝试获取同步锁,则判断线程节点是否在同步队列中,若线程节点在同步队列中,则返回已在等待队列通知给组件模块200,组件模块200转发该通知给客户端,客户端接收到已在等待队列通知后,会按照等待状态来执行相应的逻辑处理;若线程节点不在同步队列中,则判断同步队列是否已满,若同步队列已满,则返回队列已满的通知即失败通知给组件模块200,组件模块200接收到失败通知后解除对线程的阻塞,客户端接收失败通知后则按照获取失败来执行相应的逻辑处理;若同步队列未满,则判断当前同步锁是否为公平锁,若为公平锁,则将线程节点加入到同步队列的末尾位置作为新节点,并且更新同步队列中的队列数据;若同步锁为非公平锁,则将线程节点随机加入到同步队列中除头节点外的任意位置作为新节点,并且更新同步队列中的队列数据;返回新增的线程节点,判断客户端是否为异步获取锁,若客户端为异步获取锁,则返回已加入同步队列并且处于等待状态的通知给组件模块200,组件模块200接收到该通知后解除对线程的阻塞,客户端接收失败通知后则按照等待锁的状态来执行相应的逻辑处理。

参考图8,若客户端为非异步获取锁,则循环等待释放锁的信号,并且等待线程节点获取到同步锁,实时获取同步队列中的最新队列信息,即等待在先的队列请求的客户端完成业务处理后发送通知给核心控制模块,核心控制模块根据接收到的通知释放对应的同步锁,根据队列顺序为队列请求配置同步锁。并且判断线程节点是否变为头节点即是否获取到独享锁,若未获取到同步锁,则判断获取过程是否超时,若未超时则继续循环等待获取,若超时,则将同步队列中超时的线程节点移除,并且更新同步队列中的数据,返回等待超时的通知给组件模块200,组件模块200接收到该通知后解除对线程的阻塞,客户端接收等待超时通知后则按照等待超时的状态来执行相应的逻辑处理;若线程节点获取到同步锁,则返回获取所成功通知并判断客户端是否为异步获取锁,若为异步获取锁,则返回异步获取锁成功的通知给组件模块200,并且转发给客户端,客户端接收到该通知后执行后续的逻辑处理;若非异步获取所,则返回获取锁成功的通知,组件模块200接收到该通知后解除对线程的阻塞,客户端接收成功获取锁的通知后则按照获取锁成功的状态来执行相应的逻辑处理。

在可能实施的应用实例中,以获取共享锁为例,客户端的线程通过客户端组件模块中的方法向核心控制模块100的应用API接口发起请求申获取分布式锁,核心控制模块100接收到获取锁请求后,先通过数据映射模块获取该锁的同步队列信息,并交由同步控制子模块进行逻辑处理。同步控制子模块判断当前同步队列是否为空,如果队列为空且锁资源数小于请求的资源数,则返回客户端获取锁失败,即当前资源不足;如果队列为空且锁资源数不小于请求的资源数,则通过数据映射子模块提交原子操作将请求线程节点作为头节点加入同步队列,设置为获取锁状态,并将所的资源数减去线程请求的资源数,然后返回客户端获取锁成功;如果判断同步队列不为空,则判断请求线程是否已经占有锁,如果已占有锁则返回客户端不可重复占用共享锁;如果没有占用锁,则继续判断请求线程是否已在同步队列中;如果请求线程已在同步(等待)队列中,则返回客户端已在等待队列中,无需重复申请;如果不再同步队列中,则继续判断同步队列是否已满;如果同步队列已满,则返回客户端队列已满,获取锁失败;如果同步队列未满,则继续判断锁剩余资源数是否小于请求的资源数。如果锁剩余资源数不小于线程请求的资源数,则通过数据映射模块提交原子操作,将当前线程作为同步队列的头节点加入队列,设置线程节点为获取锁状态,并将锁资源数减去请求的资源数,返回客户端获取锁成功;如果判断锁剩余资源数小于线程请求的资源数,则继续判断客户端请求是否只是尝试获取锁,如果只是尝试获取锁,则返回客户端获取锁失败,资源不足;如果不是尝试获取锁,则继续后续等待流程。另外,通过数据映射子模块新增一个线程节点,并根据锁的公平性,例如如果是公平锁则选择追加到同步队列尾部或者如果是非公平所则选择除前部以获取锁节点以外的其他位置,得到新的线程节点数据。判断客户端是否为异步请求获取锁,如果是异步请求获取锁,则先返回客户端获取申请成功;同时进入循环等待锁信息处理,在节点获取到资源数时,则获取锁成功;但如果超过了设置的超时时间节点任未上升到头节点,则返回客户端获取锁超时,同时通过数据映射子模块移除该节点;当获取锁成功后,对异步方式请求获取锁的客户端进行获取锁通知,对非异步方式请求获取锁的客户端直接返回获取锁成功。

在步骤S400和步骤S500,当业务处理请求配置有同步锁后,服务器会生成相应的业务响应,并返回给客户端,通知客户端当前已分配相应的业务资源,客户端可调用业务资源进行业务处理。具体地说,服务器会根据配置好的同步锁的业务处理请求生成相应的业务相应,该业务响应能够通过组件模块200的组件函数返回给客户端,客户端接收到业务响应后,即可得知已经分配到相应的业务资源,能够进行业务处理。在一些实施例中,当客户端获取到业务响应后并根据业务响应执行对应的业务处理后,会返回业务处理后的执行结果给服务器,服务器接收到该执行结果后,能够根据执行结果释放业务处理请求中配置的同步锁,并将业务处理请求从同步队列中移除,保证了同步队列中的同步锁能够配置给新的队列请求以使同步队列的队列处理正常进行。

在可能实施的应用实例中,以释放独享锁为例进行说明,客户端线程通过客户端组件模块中的方法向核心控制模块100的应用API接口发起释放锁请求,核心控制模块100接收到释放锁请求后,先通过数据映射模块获取该锁的同步队列信息,并交由同步控制子模块进行逻辑处理,即同步控制模块判断客户线程是否有获取锁,如果没有获取锁,则返回客户端未获取锁的错误信息,如果客户线程有获取锁,则继续判是否为可重入锁及线程节点的重入深度:当锁为可重入锁且线程节点的重入深度大于1时,则通过数据映射子模块对该节点的重入深度减1,然后返回客户端释放成功,附带最新的重入深度;如果是非重入锁或者线程节点的重入深度不大于1,则进入实际锁的释放过程,例如先判断线程节点是否还有后置节点,如果没有,则表示当前同步队列中没有其他等待线程节点,此时直接通过数据映射子模块将头节点(当前线程节点)删除,并返回客户端是否锁成功即可;如果线程节点还有后置节点,则除了将头节点删除外,还需要在同一个原子操作中将后置节点设置为头节点,同时继续新的头节点获取锁通知流程;另外判断新的头节点是否还存活,如果不存活,则继续将下一个后置节点设置为头节点,同时移除非存活的原头节点;该过程一直循环直到获取锁的头节点是存活状态;断新的头节点是否需要通知获取锁,如果需要则通过客户端组件的接口进行通知,如果不需要,则结束释放锁流程。

在可能实施的应用实例中,以释放共享锁为例进行说明,客户端线程通过客户端组件模块中的方法向核心控制模块100的应用API接口发起释放锁请求,核心控制模块100接收到释放锁请求后,先通过数据映射模块获取该锁的同步队列信息,并交由同步控制子模块进行逻辑处理,即同步控制模块判断客户线程是否有获取锁,如果没有获取锁,则返回客户端未获取锁的错误信息,如果客户线程有获取锁,则通过数据映射子模块提交原子操作,将线程节点从同步队列中删除,并增加释放的锁资源数,返回客户端释放锁成功,然后继续判断同步队列中是否还有后置等待并且未获取锁的节点,d)如果同步队列中已经没有等待锁的节点,则结束流程;如果还有等待锁的节点,则对最前面的等待节点进行资源数判断,如果锁剩余资源数不满足该等待节点的资源数要求,则流程结束;如果剩余资源数满足等待节点的资源数要求,则通过数据映射子模块提交原子操作,将该等待节点设置为获取锁状态,并将锁资源数减去该等待节点的需求资源数,然后继续判断下一个等待节点,循环该过程直到同步队列中没有等待节点或锁剩余资源已经不满足等待节点的需求,则跳出循环。另外,所有新获取到锁资源的等待节点,均需要进行存活性判断,如果不存活,则需要通过数据映射模块移除该节点,并且释放该节点所占用的锁资源数;如果存活则判断是否需要通知获取锁,如果需要则通过客户端组件的接口进行通知。

在一些实施例中,服务器会获取客户端基于预设周期上传的存活标识,根据该存活标识获取同步队列中对应的业务处理请求,判断业务处理请求的请求状态与客户端的请求状态是否相同,若不相同,则判断业务处理请求是否已配置有同步锁,若业务处理请求配置有同步锁,则释放业务处理请求配置的同步锁,并将业务处理请求从同步队列中移除。其中,存活标识用于标识客户端当前的请求状态;请求状态是指客户端关于当前请求处理的业务的状态,在正常情况下客户端的请求状态与同步队列之后中的业务处理请求的请求状态相同,例如业务处理请求在同步队列外等待,则客户端处的请求状态也会是当前位于队列外等待;业务处理请求在同步队列。具体地说,客户端组件会对客户端中关于业务处理对应的活跃线程进行管理,并间隔性向核心控制模块100的心跳子模块上报客户端的请求状态,核心控制模块100接收到客户端的存活标识后,判断客户端的请求状态是否与当前队列处理中的业务处理请求的请求状态相同,即客户端是否在请求处理业务,而业务处理请求是否在请求业务资源的获取。若两者请求状态不相同,则判断业务处理请求是否已经配置有同步锁了,即当前的业务处理请求是否已经占用同步锁,如果占用了同步锁,则将业务处理请求配置的同步锁释放并移除位于同步队列中的业务处理请求。

在可能实施的应用实例中,以客户端基于预设周期上传存活标识为例进行说明,即客户端的心跳上报,其中客户端组件会对客户端程序中锁相关的活跃线程进行管理,并间隔性向核心控制模块100的心跳子模块上报状态,核心控制模块100接收到释放锁请求后,先通过数据映射模块获取该锁的同步队列信息,并交由心跳监控子模块进行逻辑处理,心跳模块先判断客户端上报的线程是否还存活,如果已经不存活,则移除服务器处的该线程的所有节点信息,并释放节点锁占用的资源,取消对应的异步通知任务等;如果线程还存活,则继续判断客户端上报的线程状态是否与服务器处的线程节点状态一致;如果客户端和服务器处的线程状态一致,则返回客户端成功,流程结束;如果状态不一致,则继续判断客户端上报的状态是否为占用锁,当客户端状态为占用锁时,返回客户端错误信息告知服务器状态,客户端处理需要根据实际业务进行处理,比如对逻辑进行回退等;当客户端状态没有占用锁时,继续判断客户端线程状态是否在等待锁,如果客户端在等待锁且服务器的状态为获取锁,则返回客户端已获取到锁的结果;如果客户端在等待且服务器的状态为没有获取锁,则服务器将线程节点加入到同步队里中,具体过程参考共享锁和独享锁的获取流程。判断客户端线程状态没有在等待锁时,如果服务器状态为已占有锁,则对该线程节点进行锁释放具体过程参考共享锁和独享锁的释放流程,如果服务器的状态为没有占用锁,则通过数据映射子模块提交原子操作,将线程节点从等待队列中移除。

在一些实施例中,服务器会发送检测请求给客户端,获取客户端根据检测请求返回的存活标识,根据存活标识获取同步队列中对应的业务处理请求;判断业务处理请求的请求状态与客户端的请求状态是否相同;若业务处理请求的请求状态与客户端的请求状态不相同,则判断业务处理请求是否配置有同步锁;若业务处理请求未配置同步锁,则移除同步队列中的业务处理请求。其中,检测请求是服务器中的核心控制模块100通过控制心跳子模块定时对客户端的活跃线程进行检测所发送的请求,即在本申请实施例中,服务器会主动获取当前客户端的运行状态,保证客户端与服务器处于正常连接状态。

在可能实施的应用实例中,以服务器端对客户端进行心跳检测为例进行说明,其中核心控制模块100和心跳子模块会定时对服务器管理的活跃线程进行监控,如果在一定周期内没有收到该线程的心跳,则主动对客户端进行存活性检查,具体地说,心跳模块通过客户端组件的心跳实现判断客户端线程的存活性,此时如果客户端进程已经不可用,则客户端连接会失败,表示该客户端进程中所有的线程都不存活;如果客户端进程可达到,则客户端组件需要返回线程的存活状态给服务器心跳模块;如果客户端线程还存活,则按接收到客户端心跳一样的逻辑进行处理(具体可参考客户端心跳上报流程);如果不存活,则继续判断服务器的线程状态是否有获取锁;如果不存活的线程在服务器端有获取锁,则在服务器进行锁释放(具体过程可参考释放锁流程);如果不存活的线程在服务器端没有获取锁,但出于等于锁状态,则通过数据映射子模块提交原子操作,将节点从同步队列中移除。

在本申请实施例中,通过获取客户端上传的用于请求业务处理的业务处理请求,根据业务处理请求确定业务处理对应的同步队列,根据同步队列配置业务处理请求对应的同步锁,根据同步锁生成业务响应后发送给客户端,以使客户端根据业务响应进行业务处理,能够高效地对不同业务分配对应的锁,从而解决分布式系统中共享资源的分配问题,提高业务处理的效率。

第二方面,本申请实施例还提供了一种电子设备,包括:至少一个处理器,以及与所述至少一个处理器通信连接的存储器;

其中,所述处理器通过调用所述存储器中存储的计算机程序,用于执行第一方面实施例中的业务处理方法。

存储器作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序以及非暂态性计算机可执行程序,如本申请第一方面实施例中的业务处理方法。处理器通过运行存储在存储器中的非暂态软件程序以及指令,从而实现上述第一方面实施例中的业务处理方法。

存储器可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储执行上述第一方面实施例中的业务处理方法。此外,存储器可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施方式中,存储器可选包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至该终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

实现上述第一方面实施例中的业务处理方法所需的非暂态软件程序以及指令存储在存储器中,当被一个或者多个处理器执行时,执行上述第一方面实施例中的业务处理方法。

第三方面,本申请实施例还提供了计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于:执行第一方面实施例中的业务处理方法;

在一些实施例中,该计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个控制处理器执行,例如,被第二方面实施例的电子设备中的一个处理器执行,可使得上述一个或多个处理器执行上述第一方面实施例中的业务处理方法。

以上所描述的设备实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。

本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统可以被实施为软件、固件、硬件及其适当的组合。某些物理组件或所有物理组件可以被实施为由处理器,如中央处理器、数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字多功能盘(DVD)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。

在本说明书的描述中,参考术语“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。

相关技术
  • 业务处理方法及装置、电子设备和计算机可读存储介质
  • 一种语音业务处理方法、电子设备和计算机可读存储介质
技术分类

06120112793261