一种业务处理方法和装置
技术领域
本公开涉及计算机技术领域,特别涉及一种业务处理方法和装置。
背景技术
在分布式的软件系统中,特别是金融行业,如果幂等处理不恰当,轻则导致数据不一致,重则导致重大的资金损失,所以正确、高效的幂等处理尤为重要。但是,当前的业务实现中,为了进行幂等控制所执行的一系列操作中,包括很耗时的大事务,这类大事务操作耗时较高,对系统的稳定性冲击非常大。
发明内容
有鉴于此,本说明书一个或多个实施例提供一种业务处理方法和装置,以降低大事务对系统稳定性的影响。
具体地,本说明书一个或多个实施例是通过如下技术方案实现的:
第一方面,提供一种基于幂等控制的业务处理方法,所述方法包括:
接收外部系统发送的业务请求;
调用分库分表计算组件,获取所述业务请求的处理对应的分库分表信息;
基于该分库分表信息,构建幂等记录;
启动幂等校验事务,将所述幂等记录保存到数据库;
在幂等记录保存成功后,启动业务处理事务执行业务请求对应的业务处理。
第二方面,提供一种幂等业务系统,所述系统包括:
分库分表计算组件,用于在接收到外部系统发送的业务请求时,获取所述业务请求的处理对应的分库分表信息;
幂等校验组件,用于基于该分库分表信息,构建幂等记录;并启动幂等校验事务,将所述幂等记录保存到数据库;
业务处理组件,用于在幂等记录保存成功后,启动业务处理事务执行业务请求对应的业务处理。
第三方面,提供一种基于幂等控制的业务处理设备,所述设备包括存储器、处理器,以及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行指令时实现以下步骤:
接收外部系统发送的业务请求;
调用分库分表计算组件,获取所述业务请求的处理对应的分库分表信息;
基于该分库分表信息,构建幂等记录;
启动幂等校验事务,将所述幂等记录保存到数据库;
在幂等记录保存成功后,启动业务处理事务执行业务请求对应的业务处理。
本说明书一个或多个实施例的业务处理方法和装置,通过将耗时较高的分库分表计算操作隔离在了事务之外,在分库分表计算工作完成后,再启动幂等校验事务,从而降低了耗时较高的大事务对数据库连接资源的影响,提高了系统稳定性。
附图说明
为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书一个或多个实施例中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本说明书一个或多个实施例提供的一种业务处理方法;
图2为本说明书一个或多个实施例提供的业务处理方法的流程;
图3为本说明书一个或多个实施例提供的一种幂等业务系统。
具体实施方式
为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书一个或多个实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本公开保护的范围。
在描述本说明书至少一个实施例的业务处理方法之前,对该方法描述中涉及到的如下几个特征进行解释说明:
事务(TRANSACTION):事务是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。例如,可以通过starttransaction在数据库启动一个事务,事务将占用数据库的连接资源。
大事务:事务中存在的耗时较高的操作,例如,有的RPC(Remote Procedure Call,远程过程调用)耗时较高。大事务的存在将使得数据库宝贵的连接资源一直占用,事务不能快速结束,影响系统的稳定性。
幂等:幂等状态指的是任意多次执行所产生的影响均与一次执行的影响相同。例如,用户A转账给用户B时,在网络层抖动的情况下,一个转账请求有可能往数据库发送两次转账请求,数据库需要控制不能给用户B转账两次钱,以免造成用户A止损。可以通过使用数据库中的唯一索引来识别幂等状态。
分库分表:将原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。在未进行分库分表的情况下,随着时间和业务的发展,数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作和增删改查的开销也会越来越大,而一台服务器的资源是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
一个业务处理的过程,通常可以包括如下依次执行的三个部分:“计算分库分表”、“幂等校验”、“业务处理”。其中,在业务处理之前,要进行幂等控制,防止出现重复操作,这就是幂等校验;而为了进行幂等校验,可以在数据库中保存幂等记录,以通过幂等记录的比较来判断是否存在重复的记录,幂等记录在数据库保存时,也需要包括分库分表信息,例如,幂等记录可以包括分库分表信息、业务请求流水号、业务请求时间等,因此,在幂等校验之前要进行分库分表的计算,确定业务请求的操作处理对应在哪个分库分表。
计算分库分表:
当接收到一个业务请求时,这个请求对应操作的数据可以是存储在某个分库分表。可以通过计算分库分表来获取该分库分表信息。当获得分库分表以后,可以构建包含该分库分表信息的幂等记录。幂等记录用于记录本次请求的时间和请求标识(如,流水号)等,以用于后续幂等比较。
幂等校验:
可以将构建的幂等记录向数据库存储,这个时候可以通过数据库的唯一索引判断是否已经存在重复的幂等记录。例如,可以根据请求标识来判断,如果数据库中已经存在相同的幂等记录,那就是该业务请求是重复的,从而实现幂等控制,防止重复操作。
业务处理:
如果幂等记录成功的保存到数据库,表明该业务请求已经通过了幂等校验,不是重复操作。则可以开始进行业务请求对应的业务处理,处理成功后,业务数据也可以保存到数据库进行存储,本次业务处理结束。
而在传统技术中,上述的业务处理流程可以是在同一个事务中执行,例如,开始时就启动一个事务,在该事务中计算分库分表、幂等校验等依次执行。然而,其中可能会出现大事务,例如,在分库分表计算时将进行RPC调用,很耗时,导致事务一直不能结束,一直占用数据库的连接资源,使得系统不稳定。
基于此,本说明书至少一个实施例提供的业务处理方法,旨在将耗时较高的操作隔离在事务之外,避免大事务问题。图1示例一个业务处理方法的流程,如图1所示,该方法可以包括:
在步骤100中,接收外部系统发送的业务请求。
例如,外部系统可以发送了一个交易请求,请求受理该交易业务。
在步骤102中,调用分库分表计算组件,获取所述业务请求的处理对应的分库分表信息。
例如,假设用于确定分库分表信息的分库分表位是会员ID,而业务请求中携带的是其他参数,则分库分表计算组件可以通过RPC调用查询该其他参数对应的会员ID,并据此获得分库分表信息。而该RPC调用的耗时比较高。
在步骤104中,基于该分库分表信息,构建幂等记录。
例如,可以根据计算得到的分库分表信息,构建幂等记录。该幂等记录包括分库分表信息,还可以包括本次业务请求的时间和请求标识等信息。
此外,如果获取分库分表位信息失败或者构建幂等记录失败,可以通知外部系统,向外部系统返回未知,外部系统可以再次重试,重新发起业务请求。
在步骤106中,启动幂等校验事务,将所述幂等记录保存到数据库。
本步骤中,可以将步骤104得到的幂等记录保存到数据库,并且,在向数据库保存时,可以根据唯一索引判断是否发生重复,数据库中是否已经存在重复的对应同一会员ID的业务请求的幂等记录。该判断是否存在重复的幂等记录的过程可以称为幂等校验。
如果在幂等校验时发生异常,可以包括两种情况:
一种情况是,发生唯一索引异常,即存在重复的幂等记录,可以称为原幂等记录。那么可以查询一下原幂等记录关联的业务状态。如果业务处理成功,可以返回外部系统业务处理成功的状态通知。
另一种情况是,是唯一索引异常之外的其他异常,可以返回外部系统未知,外部系统可以再次重试,重新发起业务请求。
上述的幂等校验发生异常时,幂等记录存储失败,数据库中将没有保存成功幂等记录;如果幂等记录存储成功,表明幂等校验通过,可以继续业务处理。
需要注意的是,本步骤的启动幂等校验事务,发生在分库分表计算之后,也就是说,即使分库分表计算中存在耗时较高的操作,也不在事务之内,从而避免了大事务的影响。
在步骤108中,在幂等记录保存成功后,启动业务处理事务执行业务请求对应的业务处理。
本步骤中,可以启动另一个事务,即业务处理事务,执行业务请求对应的业务处理。例如,如果是受理一次交易请求,那么业务处理可以是判断是否能够受理该请求,是否满足受理条件,并在满足受理条件时将本次交易信息存储在数据库中。
上述的业务处理方法,将耗时较高的分库分表计算操作隔离在了事务之外,在分库分表计算工作完成后,再启动幂等校验事务,从而降低了耗时较高的大事务对数据库连接资源的影响,提高了系统稳定性。
此外,可以将上述业务处理流程中包括的分库分表计算、幂等校验、业务处理封装成统一的幂等业务框架,外部系统发起一个业务请求到某个服务,该服务的实现就可以引用该幂等业务框架,在幂等业务框架内实现业务处理流程。并且,这种封装的幂等业务框架也为业务编程提供了一个统一的模板,当要为一个需要进行幂等控制的业务处理流程设计实现代码时,可以按照该模板设计,比较规范统一,开发起来也更加高效。
图2是本说明书至少一个实施例中的业务处理方法的流程,该方法中,可以将业务验证和构建业务模型隔离在业务处理事务之外,并且,为了方便外部系统的重试,设置了异步命令。不过,开启事务的布置以及异步命令的生成等操作,也可以单独设置其中一,本例子只是将这些处理都暂时在一个示例流程中显示。此外,本例子的各处理不限制执行顺序。
如图2所示,该方法可以包括如下处理:
在步骤200中,接收外部系统发送的业务请求。
例如,外部系统可以发送了一个交易请求,请求受理该交易业务。
在步骤202中,调用分库分表计算组件,获取所述业务请求的处理对应的分库分表信息。
这个步骤还未启动数据库事务,在事务之外执行分库分表的计算。而分库分表的计算处理中,可能会出现耗时较高的RPC调用。
例如,假设用于确定分库分表信息的分库分表位是会员ID,而业务请求中携带的是其他参数,则分库分表计算组件可以通过RPC调用查询该其他参数对应的会员ID,并据此获得分库分表信息。而该RPC调用的耗时比较高。
在步骤204中,基于该分库分表信息,构建幂等记录。
此外,如果步骤202的获取分库分表位信息失败,或者步骤204的构建幂等记录失败,这里的失败包括了任何异常结果,则可以执行步骤206。
如果构建幂等记录成功,则继续执行步骤208。
在步骤206中,通知外部系统,向外部系统返回未知,以使得外部系统可以再次重试,重新发起业务请求。
在步骤208中,启动幂等校验事务,将所述幂等记录保存到数据库。
本步骤中,可以将幂等记录保存到数据库,并且,在向数据库保存时,可以根据唯一索引判断是否发生重复,数据库中是否已经存在重复的对应同一会员ID的业务请求的幂等记录。该判断是否存在重复的幂等记录的过程可以称为幂等校验。
如果在幂等校验时发生异常,可以包括两种情况:
一种情况是,发生唯一索引异常,即存在重复的幂等记录,可以称为原幂等记录。那么可以在步骤210中查询一下原幂等记录关联的业务状态。如果业务处理成功,在步骤212中可以返回外部系统业务处理成功的状态通知。
另一种情况是,是唯一索引异常之外的其他异常,可以在步骤214中返回外部系统未知,外部系统可以再次重试,重新发起业务请求。
上述的幂等校验发生异常时,幂等记录存储失败,数据库中将没有保存成功幂等记录;如果幂等记录存储成功,表明幂等校验通过,可以继续业务处理。并且,在将幂等记录成功保存到数据库后,还可以在步骤216中生成异步命令,该异步命令用于在业务处理失败时删除保存的所述幂等记录。
需要注意的是,本步骤的启动幂等校验事务,发生在分库分表计算之后,也就是说,即使分库分表计算中存在耗时较高的操作,也不在事务之内,从而避免了大事务的影响。
在步骤218中,在幂等记录保存成功后进行业务验证,并在验证通过后构建业务模型,该业务模型用于表示业务处理成功后待保存至数据库的业务数据。
例如,以交易受理的业务为例,业务验证可以是在校验本次请求是否能够受理,是否满足受理条件。而验证通过后,可以构建业务模型,待保存至数据库。这步骤的操作中,可能会有耗时较多的操作,但是此时还未启动业务处理事务,并不会对数据库的性能和资源消耗造成影响。
当业务验证和构建业务模型成功后,可以继续执行步骤220。
在步骤220中,启动所述业务处理事务,保存所述业务模型到数据库。
此时启动业务处理的事务,即使业务验证和业务模型构建中出现耗时较高的操作,由于在事务之外,并不会对数据库的性能造成影响。本步骤中的保存业务模型到数据库后,代表业务受理成功。
当保存业务模型成功时,可以在步骤222中更新存储的幂等记录关联的业务状态为处理成功,并删除前面生成的异步命令。因为此时业务处理成功结束,不需要再删除幂等记录了。
如果业务处理事务执行异常,则可以根据异步命令,删除存储的所述幂等记录,并删除所述异步命令;还可以在步骤224中返回给外部系统异常通知。一般情况下,因为幂等记录保存到数据库了,业务受理异常如果外部没有更新请求流水号,下次就不能再受理同一业务的外部请求了,所以如果受理失败后,可以根据异步命令将保存的幂等记录删除了,以便外部再次发起请求。
上述的业务处理方法,将耗时较高的业务校验等操作隔离在了业务处理事务之外,在业务模型构建完成后,再启动业务处理事务,从而降低了耗时较高的大事务对数据库连接资源的影响,提高了系统稳定性。
该幂等业务框架可以是个通用的业务流程实现框架,可以适用于多种场景,不局限于交易受理业务场景。该框架提供了一套安全规范的编程规范,采用该框架进行幂等控制相关业务的实现编程,可以方便高效,并且还可以将耗时较高的操作隔离在事务之外,避免大事务的影响,提升业务执行效率。
为了实现上述方法,本说明书至少一个实施例还提供了一种幂等业务系统。如图3所示,该系统可以包括:分库分表计算组件31、幂等校验组件32和业务处理组件33。例如,该幂等业务系统可以是图2中所示的幂等业务框架,图2中的分库分表计算、幂等校验、业务受理可以对应于上述的三种组件。
分库分表计算组件31,用于在接收到外部系统发送的业务请求时,获取所述业务请求的处理对应的分库分表信息;
幂等校验组件32,用于基于该分库分表信息,构建幂等记录;并启动幂等校验事务,将所述幂等记录保存到数据库;
业务处理组件33,用于在幂等记录保存成功后,启动业务处理事务执行业务请求对应的业务处理。
在一个例子中,业务处理组件33,具体用于:进行业务验证,并在验证通过后构建业务模型,所述业务模型用于表示业务处理成功后待保存至数据库的业务数据;启动所述业务处理事务,保存所述业务模型到数据库。
在一个例子中,幂等校验组件32,还用于:在启动幂等校验事务将所述幂等记录保存到数据库后,还生成异步命令,所述异步命令用于在业务处理失败时删除所述幂等记录;当保存业务模型成功时,更新存储的幂等记录关联的业务状态为处理成功,并删除所述异步命令。
在一个例子中,幂等校验组件32,还用于:在启动幂等校验事务将所述幂等记录保存到数据库后,还生成异步命令,所述异步命令用于在业务处理失败时删除所述幂等记录;如果业务处理事务执行异常,则删除存储的所述幂等记录,并删除所述异步命令。
上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述图中所示流程中的各个步骤,其执行顺序不限制于流程图中的顺序。此外,各个步骤的描述,可以实现为软件、硬件或者其结合的形式,例如,本领域技术人员可以将其实现为软件代码的形式,可以为能够实现所述步骤对应的逻辑功能的计算机可执行指令。当其以软件的方式实现时,所述的可执行指令可以存储在存储器中,并被设备中的处理器执行。
例如,对应于上述方法,本说明书一个或多个实施例同时提供一种基于幂等控制的业务处理设备,该设备可以包括处理器、存储器、以及存储在存储器上并可在处理器上运行的计算机指令,所述处理器通过执行所述指令,用于实现如下步骤:
接收外部系统发送的业务请求;
调用分库分表计算组件,获取所述业务请求的处理对应的分库分表信息;
基于该分库分表信息,构建幂等记录;
启动幂等校验事务,将所述幂等记录保存到数据库;
在幂等记录保存成功后,启动业务处理事务执行业务请求对应的业务处理。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于数据处理设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。