分库分表的幂等控制方法和装置
技术领域
本申请涉及数据处理技术领域,尤其涉及一种分库分表的幂等控制方法和装置。
背景技术
随着信息技术的发展,越来越多的互联网应用都涉及到海量的数据存储和访问。数据通常以表的形式存储在数据库中,而表的容量、数据库的容量和会受到服务器硬件资源的限制。当表中的数据规模随着业务日益增长到一定程度后,常常需要将表拆分为多个数据库中的多个分表(分库分表),以维持对表中数据进行操作时的性能。
幂等控制用于保证对于重复请求的处理结果与一次请求的处理结果相同。在基于数据库的互联网应用中,用户刷新页面、在收到服务端的响应前重复某个操作都有可能产生重复请求,幂等控制对避免重复请求导致的用户资金损失、数据库产生无效数据等问题具有重要的意义。
现有技术中,一种分库分表数据库的幂等控制方式是:在数据库收到待处理的请求后,在缓存中以该请求的标识为主键插入一条幂等记录;如果插入缓存的过程中出现主键冲突异常(即缓存中已经存在以该请求的标识为主键的幂等记录),说明之前已经有过相同的请求,则将该请求作为重复请求;如果插入缓存成功,在处理该请求时要使用的分库分表本地开启本地事务,本地幂等表中以该请求的标识为主键插入一条本地记录,如果本地幂等表插入失败,说明本地幂等表中已经存在主键为该请求的标识的本地记录,则将该请求作为重复请求;如果插入本地幂等表成功,进行该请求的业务操作。该请求的业务操作成功后提交本地事务;如果失败,则回滚本地事务,由于使业务操作失败后具有该请求标识的其他请求应当被处理而不应被作为重复请求,删除缓存中具有该请求标识的幂等记录(在本地事务回滚时,在本地幂等表中插入的以该请求的标识为主键的本地记录将被删除)。
在这种方式中,由于分库分表数据库系统中,用来进行幂等控制的缓存与数据库的各个分库分表往往位于不同的设备上,在分库分表所在的设备回滚本地事务后,删除缓存中幂等记录的操作可能因种种原因失败(例如发送的删除缓存中幂等记录的指令未能到达缓存所在的设备),导致业务操作失败后重新提交的请求被作为重复请求,从而不能为用户提供对应的服务,影响了业务的正常运行。
发明内容
有鉴于此,本申请提供一种分库分表的幂等控制方法,包括:
获取对数据库操作请求的标识和分库分表位置信息;
如果全局幂等表中已存在具有所述标识的全局记录、并且所述全局记录的分库分表位置信息与所述请求的分库分表位置信息不同,将所述请求作为重复请求;否则使全局幂等表中存在具有所述请求的标识和分库分表位置信息的全局记录;
如果对应于所述请求的分库分表位置信息的本地幂等表中存在具有所述标识的本地记录,将所述请求作为重复请求;否则在处理所述请求的本地事务中,往本地幂等表中插入包括所述标识的本地记录。
本申请还提供了一种分库分表的幂等控制装置,包括:
标识获取单元,用于获取对数据库操作请求的标识和分库分表位置信息;
全局记录处理单元,用于当全局幂等表中已存在具有所述标识的全局记录、并且所述全局记录的分库分表位置信息与所述请求的分库分表位置信息不同时,将所述请求作为重复请求;否则使全局幂等表中存在具有所述请求的标识和分库分表位置信息的全局记录;
本地记录处理单元,用于当对应于所述请求的分库分表位置信息的本地幂等表中存在具有所述标识的本地记录时,将所述请求作为重复请求;否则在处理所述请求的本地事务中,往本地幂等表中插入包括所述标识的本地记录。
由以上技术方案可见,本申请的实施例中通过在全局幂等表中采用相同的请求标识和不同的分库分表位置信息来识别重复请求,由于业务操作失败后重新提交的请求将与原请求具有相同的分库分表位置信息,因而无需删除全局幂等表中的全局记录即可使重新提交的请求得到对应的业务处理,避免了因删除全局记录失败导致某个重新提交请求的业务无法正常运行,实现了更加可靠的全局幂等控制。
附图说明
图1是本申请实施例中一种分库分表的幂等控制方法的流程图;
图2是本申请应用示例中一种业务服务器上分库分表的幂等控制方法的流程图;
图3是服务器的一种硬件结构图;
图4是本申请实施例中一种分库分表的幂等控制装置的逻辑结构图。
具体实施方式
本申请的实施例提出一种新的分库分表的幂等控制方法,在全局幂等表中记录请求的标识和分库分表位置信息,将后续请求中具有相同标识和不同分库分表位置信息的请求作为重复请求,而将具有相同标识和相同分库分表位置信息的请求留待该请求的分库分表本地来判断是否属于重复请求,使得无需删除全局幂等表中的记录即可使业务失败后重新提交的请求被正常处理,提高了分库分表全局幂等控制的可靠性,以解决现有技术中存在的问题。
本申请的实施例应用在对用户涉及到分库分表、需要进行幂等控制的请求进行相应业务操作的服务器上,为描述方便,以下称之为业务服务器。需要说明的是,服务器可以是一个物理或逻辑服务器,也可以是由两个或两个以上分担不同职责的物理或逻辑服务器、相互协同来实现本申请实施例中业务服务器的各项功能;例如,接收用户请求并进行响应的功能组件可以运行在一个物理或逻辑服务器上,而分库分表可以运行在同一个物理或逻辑服务器上,也可以运行在另外的一个到多个物理或逻辑服务器上;本申请的实施例不做限定。
本申请的实施例中,分库分表的幂等控制方法的流程如图1所示。
步骤110,获取对数据库操作请求的标识和分库分表位置信息。
请求的标识用来在业务服务器的响应范围内唯一确定一个请求,即请求的全局唯一标识。根据实际应用场景,可以将请求中的某个字段或数个字段的组合作为该请求的标识,该字段或这些字段具有全局唯一性;也可以由业务服务器为来自用户的请求分配标识,标识的分配方法要使得相同的请求分配到相同的标识。标识的生成方式可参照现有技术实现。
请求的分库分表位置信息用来定位该请求的分库分表,即根据该请求进行业务操作时访问的分库分表。确定请求的分库分表的方法、以及分库分表位置信息的具体形式可根据实际应用场景的需要,参照现有技术实现,不再赘述。
对用户涉及到分库分表、需要进行幂等控制的请求,业务服务器可以为该请求生成全局唯一标识,并确定该请求的分库分表并生成分库分表位置信息;如果有其他的前置服务器负责接收用户的请求,业务服务器也可以从前置服务器获得该请求的唯一标识以及该请求的分库分表位置信息。
步骤120,如果全局幂等表中已存在具有所述标识的全局记录、并且所述全局记录的分库分表位置信息与所述请求的分库分表位置信息不同,将所述请求作为重复请求;否则使全局幂等表中存在具有所述请求的标识和分库分表位置信息的全局记录。
业务服务器在全局幂等表中保存所有其处理过的请求的相关信息,每条记录包括一个请求的标识和该请求的分库分表位置信息。根据用户请求进行的业务操作要由该请求的分库分表所在的数据库在本地事务中执行,每个分库分表对应于一个本地幂等表,业务服务器在本地幂等表中保存在对应的分库分表中进行业务操作的请求的记录,每条记录包括一个请求的标识,还可以包括该请求的分库分表位置信息以及其他信息。为了在描述中便于区分,本申请的实施例中将全局幂等表中的记录称为全局记录,将本地幂等表的记录称为本地记录。
某个请求的业务操作可能成功也可能失败,全局幂等表中所记录的处理过的请求,是所有由其分库分表所在的数据库在本地事务中处理过的请求,换言之,是所有进入本地事务处理的请求,既包括业务操作成功的请求,也包括业务操作失败的请求。
在业务操作失败后,用户可以重新提交请求,重新提交的请求将具有与业务失败的请求相同的标识和分库分表位置信息。而用户的重复请求可能在业务操作失败前、业务操作过程中、或业务操作成功后到达业务服务器,重复请求具有与原请求相同的标识,而分库分表位置信息则可能与原请求相同,也可能与原请求不同。
业务服务器在得到请求的标识和分库分表位置信息后,如果全局幂等表中已经存在具有该请求标识的全局记录,并且全局记录的分库分表位置信息和请求的分库分表位置信息不同,说明该请求是之前业务服务器已经处理过请求的重复请求。如果与不存在具有该请求标识的记录,该请求不是重复请求。如果全局幂等表中具有该请求标识的全局记录的分库分表位置信息与该请求的分库分表位置信息相同,则该请求可能是重复请求,也可能是业务操作失败后重新提交的请求。
具体而言,在一种实现方式中,业务服务器在全局幂等表中查找是否已经存在具有该请求标识的全局记录,如果不存在这样的全局记录,则将包括该请求的标识和分库分表位置信息的全局记录写入全局幂等表中,并执行步骤130。如果已经存在具有该请求的标识的全局记录,对比该全局记录的分库分表位置信息和请求的分库分表位置信息,如果相同,执行步骤130,根据分库分表对应的本地幂等表来继续进行判定;如果不同,将该请求作为重复请求。
在另一种实现方式中,业务服务器在全局幂等表中插入以请求标识为主键、包括该请求的分库分表位置信息的全局记录。当全局幂等表中已经存在具有该请求标识的全局记录时,将因主键冲突而插入失败。在发生插入失败后,查找具有相同主键的全局记录,如果该全局记录的分库分表位置信息与该请求的分库分表位置信息相同,则执行步骤130;如果该全局记录的分库分表位置信息与该请求的分库分表位置信息不同,则将该请求作为重复请求。
根据实际应用场景的具体实现,业务服务器可以根据全局记录中的分库分表位置信息获取到对重复请求的原请求(即具有相同标识的请求)的业务操作结果,并将其返回给发起请求的用户终端;业务服务器也可以对重复请求不予响应。
步骤130,如果对应于该请求的分库分表位置信息的本地幂等表中存在具有该请求标识的本地记录,将该请求作为重复请求;否则在处理该请求的本地事务中,往本地幂等表中插入包括该请求标识的本地记录。
业务服务器根据请求的分库分表位置信息确定该请求对应的本地幂等表,如果该本地幂等表中存在具有该请求标识的本地记录,说明具有该标识的请求的业务操作已成功完成、或正在处理过程中,该请求为重复请求;如果该本地幂等表中不存在具有该请求标识的本地记录,则该请求为新的请求或业务操作失败后重新提交的请求,业务数据库开启处理该请求的本地事务。在本地事务中,将具有该请求标识的本地记录添加到本地幂等表中,并执行该请求的业务操作。
具体而言,在一种实现方式中,业务服务器在本地幂等表中查找是否已经存在具有该请求标识的本地记录,如果不存在这样的本地记录,则开启处理该请求的本地事务,在本地事务中将具有该请求标识的本地记录写入本地幂等表中,并进行该请求的业务操作。如果已经存在具有该请求的标识的本地记录,将该请求作为重复请求。
在另一种实现方式中,业务服务器开启处理该请求的本地事务,在本地事务中将以该请求标识为主键的本地记录插入本地幂等表中。当本地幂等表中已经存在具有该请求标识的本地记录时,将因主键冲突而插入失败。如果插入成功,进行该请求的业务操作。如果插入失败,将该请求作为重复请求。
按照数据库本地事务的执行方式,如果处理该请求的本地事务中各项操作成功完成(添加本地记录和执行业务操作),则提交本地事务;否则回滚整个本地事务,撤销在该本地事务中对分库分表的操作,并删除在本地幂等表中添加的具有该请求标识的本地记录。这样,当某个请求的业务操作失败后,本地事务回滚将使得本地幂等表中不再存在具有该请求标识的本地记录,如果用户重新提交请求,该请求具有与原请求相同的标识和分库分表位置信息,业务服务器将会执行该请求的业务操作。
业务服务器可以在本地记录中写入请求的分库分表位置信息,如果有请求因本地幂等表中存在相同标识的请求而被作为重复请求,业务服务器可以根据本地记录中的分库分表位置信息,查找到原请求的处理结果,来对重复请求进行响应。
本申请的实施例中,全局幂等表可以在缓存中实现,也可以以文件形式或以数据库表的形式保存。由于缓存固有的更新机制通常会使得记录在一定时间后失效,对两次间隔时间较长的重复请求可能因记录失效而导致幂等控制失败,因此采用以文件形式或以数据库表的形式保存的方式可以增加幂等控制的可靠性。
如果全局幂等表采用数据库表的形式,可能也会进行分库分表。在这种方式中,可以根据请求的标识来确定每条全局记录的分库分表位置信息(例如以标识的哈希值来进行分库分表),具有相同请求标识的全局记录将被分配到同一个分库分表中,这样本实施例中对全局幂等表的查询或插入操作均可以在分库分表内部完成,降低了实现的复杂程度。
需要说明的是,本申请实施例中所说的分库分表,包括垂直切分(只分库不分表)、水平切分(只分表不分库)、以及兼有垂直切分和水平切分(既分库又分表)的情形。
可见,本申请的实施例中,在全局幂等表中记录请求的标识和分库分表位置信息,采用相同的标识和不同的分库分表位置信息来识别重复请求,而具有相同标识和相同分库分表位置信息的请求则根据本地幂等表来判断是否属于重复请求,使得无需删除全局幂等表中的全局记录即可使重新提交的请求得到对应的业务处理,提高了分库分表全局幂等控制的可靠性。
在本申请的一个应用示例中,业务服务器接收来自用户的请求,根据用户的请求对分库分表数据库进行业务操作,并向用户返回处理结果,用户的请求需要满足幂等性。业务服务器上分库分表的幂等控制流程如图2所示。
步骤201,业务服务器接收来自用户终端或用户服务器的请求。请求中包括用户账户和请求编码,其中,用户账户可以在业务服务器上唯一标识该用户,请求编码可以唯一标识通过该用户账户发起的请求。
步骤202,业务服务器提取请求中的用户账户和请求编码,将两者组合后作为请求标识。用户标识与请求标识的组合能够在业务服务器的服务范围内唯一对应于一个请求。业务服务器根据预定分库分表策略确定进行该请求的业务操作时使用的分库分表,生成该请求的分库分表位置信息。
步骤203,业务服务器在其维护的全局幂等表中插入一条全局记录,全局记录的主键是该请求的标识,该请求的分库分表位置信息作为全局记录的一个字段保存。全局幂等表按照预定的哈希算法计算某条全局记录的主键的哈希值,并且按哈希值分配该全局记录所属的分库分表,这样具有相同请求标识的全局记录将分配到同一个分库分表中。
步骤204,判断全局记录插入是否成功,如果成功,转步骤207;否则在插入全局记录发生主键冲突异常,说明业务服务器已收到过相同的请求,但本次请求可能是重复请求,也有可能是业务操作失败后重新提起的请求,此时执行步骤205。
步骤205,读取全局幂等表中主键为该请求标识的全局记录的分库分表位置信息。
步骤206,判断主键为该请求标识的全局记录的分库分表位置信息、与该请求的分库分表位置信息是否相同,如果相同,执行步骤207;如果不同,将该请求作为重复请求进行相应的处理,流程结束。
步骤207,在对应于该请求分库分表位置信息的数据库本地开启本地事务。
步骤208,在本地幂等表中插入一条本地记录,本地记录的主键是该请求的标识,该请求的分库分表位置信息作为本地记录的一个字段保存。
步骤209,判断本地记录插入是否成功,如果成功,执行步骤210;如果失败,说明已有同样的请求已经完成业务操作或正在业务操作中,将该请求作为重复请求进行相应的处理,流程结束。
步骤210,进行该请求的业务操作。
步骤211,判断该请求业务操作是否成功,如果成功,提交本地事务;否则回滚本地事务。由于步骤208中插入本地记录是本地事务中的一部分,在回滚本地事务时,会删除本地幂等表中所插入的本地记录,即具有该请求标识的本地记录。
与上述流程实现对应,本申请的实施例还提供了一种应用在服务器上的分库分表的幂等控制装置。该装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是通过服务器的CPU(Central Process Unit,中央处理器)将对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了图3所示的CPU、内存以及非易失性存储器之外,分库分表的幂等控制装置所在的服务器通常还包括用于实现网络通信功能的板卡等其他硬件。
图4所示为本申请实施例提供的一种分库分表的幂等控制装置,应用在服务器上,包括标识获取单元、全局记录处理单元和本地记录处理单元,其中:标识获取单元用于获取对数据库操作请求的标识和分库分表位置信息;全局记录处理单元用于当全局幂等表中已存在具有所述标识的全局记录、并且所述全局记录的分库分表位置信息与所述请求的分库分表位置信息不同时,将所述请求作为重复请求;否则使全局幂等表中存在具有所述请求的标识和分库分表位置信息的全局记录;本地记录处理单元用于当对应于所述请求的分库分表位置信息的本地幂等表中存在具有所述标识的本地记录时,将所述请求作为重复请求;否则在处理所述请求的本地事务中,往本地幂等表中插入包括所述标识的本地记录。
可选的,所述全局记录处理单元具体用于:在全局幂等表中插入以所述请求的标识为主键、包括所述请求的分库分表位置信息的全局记录;如果插入失败、并且所述全局记录的分库分表位置信息与所述请求的分库分表位置信息相同,则执行下一个步骤;如果插入失败、并且所述全局记录的分库分表位置信息与所述请求的分库分表位置信息不同,则将所述请求作为重复请求。
一个例子中,所述处理请求的本地事务包括:所述请求的业务操作;所述装置还包括操作结果处理单元,用于如果所述请求的业务操作成功,提交处理所述请求的本地事务;否则回滚处理所述请求的本地事务。
上述例子中,所述本地记录处理单元可以进一步包括本地事务开启模块和本地记录插入模块,其中:本地事务开启模块用于在对应于所述请求的分库分表位置信息的数据库本地开启本地事务;本地记录插入模块用于在本地幂等表中插入以所述标识为主键的本地记录;如果插入成功,进行所述请求的业务操作;否则将所述请求作为重复请求。
一种实现方式中,所述全局幂等表以文件形式保存或以数据库表的形式保存。
上述实现方式中,所述全局幂等表采用分库分表的数据库表形式保存,每条全局记录的分库分表位置信息根据所述全局记录的标识确定。
可选的,所述本地记录中还包括:所述请求的分库分表位置信息,用来在将其他具有相同标识的请求作为重复请求时,根据所述分库分表位置信息获取对所述请求的处理结果,并以获取的处理结果对所述其他具有相同标识的请求进行响应。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。