首页> 中国专利> 分布式记账数据处理方法以及分布式记账数据处理系统

分布式记账数据处理方法以及分布式记账数据处理系统

摘要

本发明涉及分布式记账数据处理方法及其装置。该方法包括:接收记账请求,所述记账请求包含与多个账户对应的多个记账明细;当根据预先设定的第一约束规则判断所述记账明细记账成功,在所述记账明细对应的账户上生成锁定金额信息;若所述记账请求对应的所有记账明细都记账成功时,使与所述记账请求对应的所有记账明细在对应的账户上生效,并且生成与所述记账请求对应的记账结果明细;若所述记账请求对应的任一记账明细未记账成功时,释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息。根据本发明,能够提高扩展性并且提高各类请求处理的TPS。

著录项

  • 公开/公告号CN114841687A

    专利类型发明专利

  • 公开/公告日2022-08-02

    原文格式PDF

  • 申请/专利权人 中国银联股份有限公司;

    申请/专利号CN202210059196.6

  • 发明设计人 王玏;赵先明;胡俊;冯哲;

    申请日2022-01-19

  • 分类号G06Q20/10(2012.01);G06F16/27(2019.01);

  • 代理机构中国专利代理(香港)有限公司 72001;中国专利代理(香港)有限公司 72001;

  • 代理人臧霁晨;姜冰

  • 地址 200135 上海市浦东新区含笑路36号银联大厦

  • 入库时间 2023-06-19 16:12:48

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-08-19

    实质审查的生效 IPC(主分类):G06Q20/10 专利申请号:2022100591966 申请日:20220119

    实质审查的生效

  • 2022-08-02

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及计算机技术领域,具体地涉及一种分布式记账数据处理方法以及分布式记账数据处理系统。

背景技术

现有的统一账务系统中,在同一账套下开立的多个账户存在在单台redis中,此处的统一账套为业务上具有关联性的相同或相似业务。单台部署的redis实例单线程处理的事务性可以保持原子性和数据一致性,但同时也带来了以下限制:

(1)可扩展性不足:由于单账套内的数据存储于同一台redis实例中,此种分片方式使redis对于单个账套不可横向扩展。

(2)性能不足:受限于单台redis实例的性能和内存存储容量瓶颈,使得系统对于单账套存在TPS(Transactions Per Second,每秒事务数)上限,预期内不足以满足业务的发展。对于业务量较大的账套,也势必会造成redis集群内节点间的负载不均衡,资源利用的不充分。

(3)记账阻塞导致的排队:基于业务需要,实际中存在记账包含大量记账明细的记账请求。由于单台redis实例单线程串行处理记账请求,明细数量大、处理时间长的记账请求导致redis的阻塞,高并发时会导致后续记账请求的排队,严重时有请求处理超时的风险。

发明内容

鉴于上述问题,本发明旨在提供一种高可扩展性和高性能的分布式记账数据处理方法以及分布式记账数据处理系统。

本发明一方面的分布式记账数据处理方法,其特征在于,该分布式记账数据处理方法用于对于多个分布式存储的账户进行记账,包括:

接收记账请求,所述记账请求包含与多个账户对应的多个记账明细;

当根据预先设定的第一约束规则判断所述记账明细记账成功,在所述记账明细对应的账户上生成锁定金额信息;

若所述记账请求对应的所有记账明细都记账成功时,使与所述记账请求对应的所有记账明细在对应的账户上生效,并且生成与所述记账请求对应的记账结果明细;

若所述记账请求对应的任一记账明细未记账成功时,释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息。

可选地,所述当根据预先设定的第一约束规则判断所述记账明细记账成功,在所述记账明细对应的账户上生成锁定金额信息包括:

判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为是,则将所述记账明细记账入所述余额信息,若判断为否,则所述余额信息不变;

当所述余额信息满足所述第一约束规则,则在所述记账明细对应的账户上生成锁定金额信息,所述记账明细记账成功。

可选地所述余额信息包括:可用余额、冻结金额、授信额度;

判断所述记账明细的发生额是否与所述记账明细对应的账户的可用额度是否反向,若判断为是,则将所述记账明细记账入所述可用额度,若判断为否,则所述可用额度不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额是否反向,若判断为是,则将所述记账明细记账入所述冻结金额,若判断为否,则所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度是否反向,若判断为是,则将所述记账明细记账入所述授信额度,若判断为否,则所述授信额度不变;

可选地所述第一约束规则包括:

记账后可用余额不小于0;

记账后冻结金额不小于0;以及

记账后授信额度不小于0;

若同时满足以上条件,则判定为满足所述第一约束规则。

可选地所述使所述所有记账明细在对应的账户上生效,包括:

判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为否,则将所述记账明细记账入所述余额信息,若判断为是,所述余额信息不变;以及

删除所述记账明细在对应的账户上的锁定金额信息。

可选地所述使所述所有记账明细在对应的账户上生效,包括:

判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为否,则将所述记账明细记账入所述可用余额,若判断为是,所述可用余额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为否,则将所述记账明细记账入所述冻结金额,若判断为是,所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为否,则将所述记账明细记账入所述授信额度,若判断为是,所述授信额度不变;

删除所述记账明细在对应的账户上的锁定金额信息。

可选地所述释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息包括:

判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为是,则将所述记账明细的负值记账入所述余额信息,若判断为否,则所述余额信息不变;以及

删除所述记账明细在对应的账户上的锁定金额信息。

可选地所述释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息包括:

判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为是,则将所述记账明细的负值记账入所述可用余额,若判断为否,则所述可用余额不变;以及

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为是,则将所述记账明细的负值记账入所述冻结金额,若判断为否,则所述冻结金额不变;以及

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为是,则将所述记账明细的负值记账入所述授信额度,若判断为否,则所述授信额度不变;以及

删除所述记账明细在对应的账户上的锁定金额信息。

可选地所述分布式存储的账户通过哈希算法得到对应的分块号,不同的分块号所对应的账户的记账数据储存在不同的redis中。

可选地所述账户上的锁定金额信息为一个存储于所述redis中的锁定金额哈希表中的键值对,所述键值对中包含所述记账请求的序列号、所述账户的可用余额、锁冻结金额、授信额度及时间信息。

本发明一方面的分布式记账数据处理装置,其特征在于,该分布式记账数据处理装置用于对于多个分布式存储的账户进行记账,包括:试算模块、确认模块以及释放模块,

其中,所述试算模块用于接收记账请求,所述记账请求包含与多个账户对应的多个记账明细,所述试算模块当根据预先设定的第一约束规则判断所述记账明细记账成功,在所述记账明细对应的账户上生成锁定金额信息;

所述确认模块用于在所述记账请求对应的所有记账明细都记账成功时,使与所述记账请求对应的所有记账明细在对应的账户上生效,并且生成与所述记账请求对应的记账结果明细,

所述释放模块用于在所述记账请求对应的任一记账明细未记账成功时,释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息。

可选地在所述试算模块中,判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为是,则将所述记账明细记账入所述余额信息,若判断为否,则所述余额信息不变;当所述余额信息满足所述第一约束规则,则在所述记账明细对应的账户上生成锁定金额信息,所述记账明细记账成功。

可选地所述余额信息包括:可用余额、冻结金额、授信额度;

在所述试算模块中,

判断所述记账明细的发生额是否与所述记账明细对应的账户的可用额度是否反向,若判断为是,则将所述记账明细记账入所述可用额度,若判断为否,则所述可用额度不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额是否反向,若判断为是,则将所述记账明细记账入所述冻结金额,若判断为否,则所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度是否反向,若判断为是,则将所述记账明细记账入所述授信额度,若判断为否,则所述授信额度不变;

可选地所述第一约束规则包括:

记账后可用余额不小于0;

记账后冻结金额不小于0;以及

记账后授信额度不小于0;

若同时满足以上条件,则判定为满足所述第一约束规则。

可选地在所述确认模块中,判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为否,则将所述记账明细记账入所述余额信息,若判断为是,所述余额信息不变;以及

删除所述记账明细在对应的账户上的锁定金额信息。

可选地在所述确认模块中,判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为否,则将所述记账明细记账入所述可用余额,若判断为是,所述可用余额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为否,则将所述记账明细记账入所述冻结金额,若判断为是,所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为否,则将所述记账明细记账入所述授信额度,若判断为是,所述授信额度不变;

删除所述记账明细在对应的账户上的锁定金额信息。

可选地在所述释放模块中,判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为是,则将所述记账明细的负值记账入所述余额信息,若判断为否,则所述余额信息不变;以及删除所述记账明细在对应的账户上的锁定金额信息。

可选地在所述释放模块中,判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为是,则将所述记账明细的负值记账入所述可用余额,若判断为否,则所述可用余额不变;判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为是,则将所述记账明细的负值记账入所述冻结金额,若判断为否,则所述冻结金额不变;判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为是,则将所述记账明细的负值记账入所述授信额度,若判断为否,则所述授信额度不变;以及删除所述记账明细在对应的账户上的锁定金额信息。

可选地所述分布式存储的账户通过哈希算法得到对应的分块号,不同的分块号所对应的账户的记账数据储存在不同的redis中。

可选地所述账户上的锁定金额信息为一个存储于所述redis中的锁定金额哈希表中的键值对,所述键值对中包含所述记账请求的序列号、所述账户的可用余额、锁冻结金额、授信额度及时间信息。

本发明的计算机可读介质,其上存储有计算机程序,该计算机程序被处理器执行时实现所述的分布式记账数据处理方法。

本发明的计算机设备,包括:存储器;处理器;以及存储在所述存储器上并可在所述处理器上运行的计算机程序,该计算机程序的运行使得所述处理器执行所述计算机程序时实现所述的分布式记账数据处理方法。

如上所述,本发明的分布式记账数据处理方法采用分布式架构,使用TCC(Try-Confirm-Cancel,试算-确认-释放)框架进行多个redis中账户的分布式记账来代替原有单个事务在单个redis中的记账逻辑,通过引入了双向增长的余额场景下的记账成功约束及锁定金额机制,能够保证高并发场景下账户数据的一致性,在提升系统处理能力的同时解决了由于数据分片规则改变带来的分布式事务问题。因此,根据本发明的分布式记账数据处理方法及其装置通能够提升系统整体的性能和存储容量,而且,能够提高各类请求处理的TPS,再者,通过将明细数量大的记账请求在多台redis实例中进行记账,由此能够大幅缩短对单台redis实例的阻塞。

附图说明

图1是本发明的分布式记账数据系统的记账逻辑示意图。

图2是本发明的分布式记账数据处理方法的流程示意图。

图3是表示Try阶段的具体流程的流程示意图。

图4是表示Confirm阶段的具体流程的流程示意图。

图5是表示Cancel阶段的具体流程的流程示意图。

图6是本发明的分布式记账数据处理装置结构框图。

具体实施方式

下面介绍的是本发明的多个实施例中的一些,旨在提供对本发明的基本了解。并不旨在确认本发明的关键或决定性的要素或限定所要保护的范围。

出于简洁和说明性目的,本文主要参考其示范实施例来描述本发明的原理。但是,本领域技术人员将容易地认识到,相同的原理可等效地应用于所有类型的分布式记账数据处理方法,并且可以在其中实施这些相同的原理,以及任何此类变化不背离本专利申请的真实精神和范围。

而且,在下文描述中,参考了附图,这些附图图示特定的示范实施例。在不背离本发明的精神和范围的前提下可以对这些实施例进行电、机械、逻辑和结构上的更改。此外,虽然本发明的特征是结合若干实施/实施例的仅其中之一来公开的,但是如针对任何给定或可识别的功能可能是期望和/或有利的,可以将此特征与其他实施/实施例的一个或多个其他特征进行组合。因此,下文描述不应视为在限制意义上的,并且本发明的范围由所附权利要求及其等效物来定义。

诸如“具备”和“包括”之类的用语表示除了具有在说明书和权利要求书中有直接和明确表述的单元(模块)和步骤以外,本发明的技术方案也不排除具有未被直接或明确表述的其它单元(模块)和步骤的情形。

在说明本发明的分布式记账数据处理方法之前,先对一些本领域的技术术语进行说明。

统一账务系统账户中目前有余额、冻结金额、授信额度、可用余额4个余额域。其中,可用余额由另外3个余额确定,即,可以表示为:可用余额=余额+授信额度-冻结金额。相应地,支持对账户执行贷记发生/借记发生、冻结/解冻、授信调增/授信调减3对互为反向的记账操作。

其中,记账操作对4个余额域的作用如下:

贷记发生:若账户余额为贷记,则使余额正向增长,因此可用余额正向增长;若账户余额为借记,则使余额负向增长,因此可用余额负向增长。

借记发生:若账户余额为借记,则使余额正向增长,因此可用余额正向增长;若账户余额为贷记,则使余额负向增长,因此可用余额负向增长。

冻结:使冻结金额正向增长,因此可用余额负向增长。

解冻:使冻结金额负向增长,因此可用余额正向增长。

授信调增:使授信额度正向增长,因此可用余额正向增长。

授信调减:使授信额度负向增长,因此可用余额负向增长。

余额的足够与否决定了对帐户的记账能否成功。

本发明的分布式记账数据处理方法采用分布式架构,使用TCC(Try-Confirm-Cancel)框架进行多个redis中账户的分布式记账,代替原有单个事务在单个redis中的记账逻辑,而且,在本发明的分布式记账数据处理方法中同时引入了双向增长的余额场景下的记账成功约束及锁定金额机制,用以保证高并发场景下账户数据的一致性,在提升系统处理能力的同时能够解决由于数据分片规则改变带来的分布式事务问题。

现有的统一账务系统的业务逻辑要求一笔记账请求中所有记账明细处理结果的事务性,即一笔记账请求对其中所有记账明细所涉及的账户的记账结果的一致性(所有账户均记账成功或所有账户均记账失败)。现有技术架构中,由于同一账套的所有数据均分布于同一redis内,因此通过redis对记账lua脚本的单线程执行即可保证多笔记账并发时每笔记账处理的原子性,进而保证记账请求中所有记账明细及所有账户记账状态的一致性。

图1是本发明的分布式记账数据系统的记账逻辑示意图。

如图1所示,在本发明的分布式记账数据处理方法中,将redis中数据的分片依据由为按技术含义的分块号block_id切分。并且,在本发明的分布式记账数据处理方法中,分块号block_id由redis数据的键通过哈希算法计算得到。

这样,在本发明中,由于分片依据改变后,同一个账套下各账户分布在集群中不同redis实例中。由于不再如上述的现有技术那样由同一redis实例的单线程执行记账请求的完整记账操作,必然存在多笔记账请求并发处理时的分布式事务问题。

针对这样的分布式事务问题,在本发明的分布式记账数据处理方法中采用了TCC(Try-Confirm-Cancel)方式,并且同时引入了在可用余额、冻结金额、授信额度3个余额域双向增长场景下的记账成功约束机制以及锁定金额机制。

在本发明的分布式记账数据处理方法中,记账成功约束机制的定义如下:

试算记账完成后,账户的余额需满足以下条件:

1)记账后可用余额不小于0;

2)记账后冻结金额不小于0;以及

3)记账后授信额度不小于0;

若同时满足以上条件,则判定通过,否则不通过。

由于一笔记账请求中可能存在对同一账户的多笔记账明细,记账成功约束的判定以该账户的多笔记账明细按顺序记账过程中各字段的累计最小值判断。例如:若记账前某一账户某一余额域的期初余额为A,记账请求对该账户该余额依次有+1、-2、+3的记账明细,记账过程中该余额依次有A+1、A-1、A+2的累积值,则按照其中最小值A-1进行试算。

锁定金额的机制定义如下:

锁定金额表示该笔记账在处理过程中占用相应余额的量,其数值等于该笔记账对对应余额域上产生的变化量,在redis中锁定金额以该账户的锁定金额哈希表中“记账请求ID->锁定可用余额:锁定冻结金额:锁定授信额度:时间戳”的键值对的形式存在。

图2是本发明的分布式记账数据处理方法的流程示意图。

如图2所示,本发明的分布式记账数据处理方法采用TCC(Try-Confirm-Cancel)方式,具体可以分为Try阶段(试算阶段)S100、Confirm阶段(确认阶段)S200、以及Cancel阶段(释放阶段)S300这三个阶段。

具体地,如图2所示,本发明的分布式记账数据处理方法用于对于多个分布式存储的账户进行记账,该方法包括:

Try阶段(试算阶段)S100:遍历记账请求所涉及的所有账户,根据记账成功约束试算该账户的所有记账明细能否成功记账,若能成功则在所述记账明细对应的账户上生成锁定金额信息,即使用锁定金额占用相应的资源(余额)。此阶段成功以生成锁定金额信息为标志;

Confirm阶段(确认阶段)S200:若记账请求所涉及的所有账户在Try阶段成功,则执行Confirm阶段,使与所述记账请求对应的所有记账请求明细在对应的的账户上生效,即所有资源的变化生效,并生成与所述记账请求对应的记账结果明细。此阶段以生成记账结果明细为标志;以及

Cancel阶段(释放阶段)S300:若记账请求所涉及的账户中有任一账户在Try阶段失败,则执行Cancel阶段,释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息,即释放在对应账户上占用的资源(余额)。

接着,对于Try阶段(试算阶段)、Confirm阶段(确认阶段)以及Cancel阶段(释放阶段)这三个阶段进行具体说明。

图3是表示Try阶段(试算阶段)的具体流程的流程示意图。

在每个账户的Try阶段,满足记账成功约束的前提下若记账使账户的可用余额、冻结金额、授信额度向0的方向增长(其中,“可用余额、冻结金额、授信额度向0的方向增长”实际上是指“可用余额、冻结金额、授信额度减少”),则将相应地变动余额,否则余额变动为0。而后将该笔请求对余额的变动记录至账户锁定金额哈希表对应的锁定可用余额、锁定冻结金额、锁定授信额度中。

如图3所示,Try阶段的具体流程包括:

S101:判断是否已生成账户的记账明细的发生额,若是则跳至步骤S111,若否则继续步骤S102;

S102:判断是否已生成记账请求的锁定金额,若是则跳至步骤S111,若否则继续步骤S103;

S103:判断是否所有记账明细处理完成,若是则跳至步骤S110,若否则继续步骤S104;

S104: 判断是否记账明细的发生额与余额反向,若是则继续步骤S105,若否则继续步骤S106,这里的“与余额反向”是指向0的方向增长;

S105: 余额变动值等于发生额;

S106: 余额变动值等于0;

S107: 将变动值累计入余额;

S108: 判断累计余额是否满足记账成功约束,若是则返回步骤S103,若否则继续步骤S109;

S109: Try失败;

S110:余额变动量写入锁定金额,即生成锁定金额信息;

S111: Try成功。

图4是表示Confirm阶段(确认算阶段)的具体流程的流程示意图。

在每个账户的Confirm阶段,确认账户中记录了该笔记账的锁定金额后,提交余额的变动包括:

判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为否,则将所述记账明细记账入所述可用余额,若判断为是,所述可用余额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为否,则将所述记账明细记账入所述冻结金额,若判断为是,所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为否,则将所述记账明细记账入所述授信额度,若判断为是,所述授信额度不变;

删除所述记账明细在对应的账户上的锁定金额信息。

如图4所示,Confirm阶段的具体流程包括:

S201:判断是否已生成账户的记账明细的发生额,若是则跳至步骤S210,若否则继续步骤S202;

S202:判断是否已生成记账请求的锁定金额,若是至继续步骤S203,若否则跳至步骤S211;

S203:是否所有记账明细处理完成,若是则跳至步骤S208,若否则继续步骤S204;

S204: 判断是否记账明细的发生额与余额反向,若是则继续步骤S205,若否则继续步骤S206;

S205: 余额变动值等于0;

S206: 余额变动值等于发生额;

S207: 将变动值累计入余额;

S208: 删除锁定金额;

S209: 使与所述记账请求对应的所有记账明细在对应的账户上生效并且生成与所述记账请求对应的记账结果明细;

S210:Confirm成功;

S211:Confirm失败。

图5是表示Cancel阶段的具体流程的流程示意图。

在每个账户的Cancel阶段,确认账户中记录了该笔记账的锁定金额后,回滚先前的余额变动包括:判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为是,则将所述记账明细的负值记账入所述可用余额,若判断为否,则所述可用余额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为是,则将所述记账明细的负值记账入所述冻结金额,若判断为否,则所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为是,则将所述记账明细的负值记账入所述授信额度,若判断为否,则所述授信额度不变;以及

删除所述记账明细在对应的账户上的锁定金额信息。

如图5所示,Cancel阶段的具体流程包括:

S301:判断是否已生成账户请求的锁定金额,若否则跳至步骤S308,若是则继续步骤S302;

S302:判断是否已所有记账明细处理完成,若是至跳至步骤S307,若否则继续步骤S303;

S303:判断记账明细的发生额与余额是否反向,若是则继续步骤S304,若否则继续步骤S305;

S304: 余额变动值等于发生额;

S305: 余额变动值等于0;

S306: 将变动值累计入余额;

S307: 删除锁定金额;

S308:成功。

上述某一账户相关的信息、余额、锁定金额、记账结果明细在redis中均按照该账户账号哈希得到的分块号block_id存储于同一redis中,因此对单个账户的Try、Confirm、Cancel操作均通过调用装载在redis中的lua脚本在该账户所在的单个redis实例中执行,以此保证账户数据操作的原子性及执行前后账户余额的一致性。

对帐户的Try、Confirm、Cancel三个阶段通过在执行前判断锁定金额及记账明细的发生额是否存在来保证其冥等性(冥等性是指确保用户无论是否重复操作,其结果都只有一次,以保障需要的数据只响应执行一次),以防止在请求处理中断后重做等异常情况下TCC逻辑对账户记账状态的错误判定和重复记账。

本发明的分布式记账数据处理方法采用分布式架构,使用TCC(Try-Confirm-Cancel)框架进行多个redis中账户的分布式记账,代替原有单个事务在单个redis中的记账逻辑。在本发明的分布式记账数据处理方法中,引入了双向增长的余额场景下的记账成功约束及锁定金额机制,用以保证高并发场景下账户数据的一致性,在提升系统处理能力的同时解决了由于数据分片规则改变带来的分布式事务问题。

以上说明本发明的分布式记账数据处理方法,接着对于本发明的分布式记账数据处理系统进行说明。

图6是本发明的分布式记账数据处理装置结构框图。

如图6所示,本发明的分布式记账数据处理装置用于对于多个分布式存储的账户进行记账,包括:试算模块100、确认模块200以及释放模块300。

其中,试算模块100用于接收记账请求,所述记账请求包含与多个账户对应的多个记账明细,试算模块100当根据预先设定的第一约束规则判断所述记账明细记账成功,在所述记账明细对应的账户上生成锁定金额信息。

确认模块200用于在所述记账请求对应的所有记账明细都记账成功时,使与所述记账请求对应的所有记账明细在对应的账户上生效,并且生成与所述记账请求对应的记账结果明细。

释放模块300用于在所述记账请求对应的任一记账明细未记账成功时,释放与所述记账请求对应的所有记账明细在对应账户上的锁定金额信息。

其中,对于多个账户的记账数据采用分块号进行切分后分配至多个redis进行处理。而且,所述分块号由redis数据的键通过哈希算法计算得到。而且,对于同一账户,余额、锁定金额、记账结果明细按照该账户账号的分块号存储于同一redis中。对于同一账户下的所述试算模块100、所述确认模块200以及所述释放模块300均通过调用装载在redis中的lua脚本在该账户所在的单个redis实例中执行。

其中,试算模块100设置执行以下动作:

判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为是,则将所述记账明细记账入所述余额信息,若判断为否,则所述余额信息不变;当所述余额信息满足所述第一约束规则,则在所述记账明细对应的账户上生成锁定金额信息,所述记账明细记账成功。

其中,所述锁定金额表示该笔记账在处理过程中占用相应余额的量。

所述余额信息包括:可用余额、冻结金额、授信额度。

在所述试算模块100中,判断所述记账明细的发生额是否与所述记账明细对应的账户的可用额度是否反向,若判断为是,则将所述记账明细记账入所述可用额度,若判断为否,则所述可用额度不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额是否反向,若判断为是,则将所述记账明细记账入所述冻结金额,若判断为否,则所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度是否反向,若判断为是,则将所述记账明细记账入所述授信额度,若判断为否,则所述授信额度不变。

可选地,所述第一约束规则包括:

记账后可用余额不小于0;

记账后冻结金额不小于0;以及

记账后授信额度不小于0;

若同时满足以上条件,则判定为满足所述第一约束规则。

其中,在所述redis中,所述锁定金额对应于该账户分块号而存在,

所述锁定金额包括:锁定可用余额、锁定冻结金额以及锁定授信额度。

在所述确认模块200中,判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为否,则将所述记账明细记账入所述余额信息,若判断为是,所述余额信息不变;以及删除所述记账明细在对应的账户上的锁定金额信息。

其中,在所述确认模块200中,判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为否,则将所述记账明细记账入所述可用余额,若判断为是,所述可用余额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为否,则将所述记账明细记账入所述冻结金额,若判断为是,所述冻结金额不变;

判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为否,则将所述记账明细记账入所述授信额度,若判断为是,所述授信额度不变;

删除所述记账明细在对应的账户上的锁定金额信息。

其中,释放模块300设置为执行以下动作:

判断所述记账明细的发生额是否与所述记账明细对应的账户的余额信息反向,若判断为是,则将所述记账明细的负值记账入所述余额信息,若判断为否,则所述余额信息不变;以及删除所述记账明细在对应的账户上的锁定金额信息。

可选地,在所述释放模块300中,判断所述记账明细的发生额是否与所述记账明细对应的账户的可用余额反向,若判断为是,则将所述记账明细的负值记账入所述可用余额,若判断为否,则所述可用余额不变;判断所述记账明细的发生额是否与所述记账明细对应的账户的冻结金额反向,若判断为是,则将所述记账明细的负值记账入所述冻结金额,若判断为否,则所述冻结金额不变;判断所述记账明细的发生额是否与所述记账明细对应的账户的授信额度反向,若判断为是,则将所述记账明细的负值记账入所述授信额度,若判断为否,则所述授信额度不变;以及删除所述记账明细在对应的账户上的锁定金额信息。

其中,所述分布式存储的账户通过哈希算法得到对应的分块号,不同的分块号所对应的账户的记账数据储存在不同的redis中。

并且,所述账户上的锁定金额信息为一个存储于所述redis中的锁定金额哈希表中的键值对,所述键值对中包含所述记账请求的序列号、所述账户的可用余额、锁冻结金额、授信额度及时间信息。

本发明的分布式记账数据处理方法及其装置,能够得到以下技术效果:

(1)高可扩展性:

可通过redis实例的横向扩展突破单个redis实例的性能和内存存储容量对任意账套的限制,提升系统整体的性能和存储容量。且理论上,系统整体性能和存储容量与系统内redis实例个数呈线性关系,redis实例的横向扩展对统一账务系统应用及接入统一账务系统的外部业务系统无感。而且,同时系统仍保留原有按账套对数据进行切分的能力:在必要时可按需将账套数据独立切分至独立的redis集群,以避免与其他账套共用带来的的性能或容量的相互影响。

(2)高性能:

在本发明中对任意账套各类请求处理的TPS将较现有技术方案有大幅提高,单台redis实例的内存压力消除, redis实例之间的负载不均衡大幅缓解,redis算力及存储资源利用更充分。

(3)记账请求处理碎片化:

在本发明中,明细数量大的记账请求在多台redis实例中进行记账,单一记账请求碎片化,对单台redis实例的阻塞大幅缩短,高并发时多个请求并行执行,请求的排队因此缓解。

以上例子主要说明了本发明的分布式记账数据处理方法及其装置。尽管只对其中一些本发明的具体实施方式进行了描述,但是本领域普通技术人员应当了解,本发明可以在不偏离其主旨与范围内以许多其他的形式实施。因此,所展示的例子与实施方式被视为示意性的而非限制性的,在不脱离如所附各权利要求所定义的本发明精神及范围的情况下,本发明可能涵盖各种的修改与替换。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号