腾讯财付通会计核算系统原理与架构
2022-12-27 18:1:24 Author: 腾讯技术工程(查看原文) 阅读量:17 收藏

作者:shuangchen,腾讯 FiT 线后台开发工程师

财付通作为业界领先的第三方支付公司,一直致力于为互联网用户和各类企业提供安全便捷的在线支付服务,本文将介绍财付通如何通过会计核算系统来保障财付通亿万资金安全。

1. 背景

1.1. 财付通资金账务系统介绍

1.1.1. 账户体系

财付通作为业界领先的第三方支付公司,一直致力于为互联网用户和各类企业提供安全便捷的在线支付服务。财付通为用户或商户创建支付账户,用于承载用户或商户资金余额以及余额变动情况。财付通资金账务系统中,按账户属性分为现金账户、交易账户和内部银行账户。

  • 现金账户(Cash Account),属于负债类账户,财付通资金账务系统中主要为财付通用户分配的一个电子货币账户,该账户的特点是其中资金可由持有者自由支配,用户可以通过提现操作完成现金账户向用户银行卡进行资金的转移,还可以通过充值操作完成用户银行卡资金向现金账户的转移。
  • 交易账户(Business Account),属于负债类账户,财付通资金账务系统中给商户分配的一类电子货币账户,该账户用户记录商户的已收待结资金。交易账户资金商户可以退款给用户,也可以由财付通平台定期结算给商户现金账户或商户银行卡。
  • 内部银行账户(Bank Account),属于资产类账户,财付通资金账务系统中为银行渠道分配的一类电子货币账户,此账户资金和财付通的银行备付金账户资金对应。当发生充值或提现操作时候会产生内部银行账户的资金流水。
1.1.2. 借贷复式记账法

财付通资金账务系统采用借贷记账法,借贷记账是复式记账法的一种,它是以“”,“”为记账符号,对于每一笔经济业务,都用相等的金额在交易双方账户中进行登记,全面系统地反映交易要素增减变化的一种记账方法。

  • 借,指借出款项,即债权增加,资产类账户(内部银行账户)加钱记借,负债账户(现金账户,交易账户)减钱记借
  • 贷,指收入款项,即债务增加,负债账户(现金账户,交易账户)加钱记贷,资产类账户(内部银行账户)减钱记贷
1.1.2.1 记账流程

交易驱动交易参与双方账户余额变动,账户余额变动的同时记录账户余额变动流水,反映每次余额变动的过程。

1.1.2.2. 常见交易的记账举例

以常见交易类型充值,支付,提现为例,描述财付通资金账务系统如何进行记账,以及如何理解记账符号。

1.2. 如何稽核财付通资金账务系统

财付通资金账务系统管理海量账户数据,处理天量交易数据,涉及金额巨大,试想如果出现了以下场景:

  • 场景 1:A 觉得余额太少了,给自己的账户余额加了 10000 元,篡改余额
  • 场景 2:A 支付给 B 100 元,A 扣钱了,B 未加钱,单边记账
  • 场景 3:A 支付给 B 100 元,A 扣了 100 元,B 加了 50 元,记错账

以上记账异常的场景都会带来资金损失,本文将详细介绍财付通会计核算系统如何通过记录会计账会计核对来稽核资金账,保障财付通亿万资金安全。

2. 财付通会计核算系统

2.1. 总体设计

会计核算系统包含记录会计账与会计核对两部分。

  • 会计账包含了会计分户账和会计总账,会计核算系统从资金账务系统采集流水编制记账凭证,根据记账凭证驱动分户账和总账记账,会计账会给财务和业务提供会计报表,同时也是会计核对的数据基础。

  • 会计核对包含下面几个公式:

    • 分户核对:资金账户余额 = 会计账分户余额

    • 总账核对借方发生额 = 贷方发生额,资产 = 负债

    • 总分核对资产总账余额 = ∑ 资产类分户余额,负债总账余额 = ∑ 负债类账户余额

  • 下图简要描述了当资金账务系统对“现金账户 C 充值 100 元”,“现金账户 C 向交易账户 B 支付 100 元”进行记账时,资金账与会计账的变化,以及会计核对中核对要素之间的关系。

2.2. 具体原理

本章将通过详细介绍会计核对原理来描述财付通会计核算系统如何通过会计账和会计核对来稽核资金账务系统记账准确性。

2.2.1. 分户核对原理
  • 分户是什么分户是会计中根据明细分类科目设置的,用来对会计要素具体内容进行明细分类核算的账户。为了稽核资金账务系统计账准确,设置的财付通会计分户与资金账户对应,设置为现金分户、交易分户和内部银行分户。
  • 会计分户如何记账会计分户余额计算公式
会计期初余额 + 发生额 = 会计期末余额

设每个新账户会计期初余额=0,持续获取该账户的所有交易的发生额,计算会计期末余额并记录,作为下一周期的会计期初余额,以账户 A 为例,该账户在会计分户账中记录为

账户 ID账期当前账期期初余额当前账期借方发生额当前账期贷方发生额当前账期期末余额
A账期 10103020
A账期 2203010090
A账期 390501050
A...



  • 分户核对是什么分户核对就是验证每个分户在每个核对区间都满足以下两条等式,
资金账户期初余额 = 会计分户期初余额
资金账户期末余额 = 会计分户期末余额

假设发生了 1.2 节中的场景 1:A 觉得余额太少了,给自己的账户余额加了 10000 元,那么分户核对将发现异常: 会计账期末余额 90 != 资金账期末余额 10090

2.2.2. 总账核对原理
  • 总账核对是什么总账核对即每个核对区间,对于全部账户合计,验证以下两条等式成立,其中等式 ① 源于借贷记账原理,等式 ② 源于会计恒等式
① 借方发生额 = 贷方发生额,可变形为 Σ交易账户借方发生额 + Σ现金账户借方发生额 + Σ内部银行账户借方发生额 = Σ交易账户贷方发生额 + Σ现金账户贷方发生额 + Σ内部银行账户贷方发生额,称为发生额试算平衡
② 资产 = 负债,可变形为 Σ内部银行分户余额 = Σ交易分户余额 + Σ现金分户余额,称为余额试算平衡
  • 假设账期 1 发生了三笔交易,核对示例如下:

  • 若发生了 1.2 节中的场景 2:A 支付给 B 100 元,A 扣钱了,B 未加钱和场景 3:A 支付给 B 100 元,A 扣了 100 元,A 加了 50 元,都会触发总账核对异常。

    以场景 2 为例,用户 A 向商户 B 支付 100 元,商户 B 未收款:

  • 明细总账核对 总账记账汇总当前账期的所有交易进行记账,当出现异常时,只能确定到某核对区间存在借贷不相等的情况,无法定位到具体的交易,所以在总账核对的基础上,增加明细核对,对该区间所有的交易,对每个交易内进行发生额试算平衡,可以快速定位到出现异常的交易。

    依旧以场景 2 为例,总账核对异常后,此时对账期 1 内所有交易进行明细级别总账核对,定位到具体异常的交易。

2.2.3. 总分核对原理

保证总账各科目余额应与同科目各分户账余额相同,科目总账余额必须等于其对应的分户账相应余额总和,以此验证会计账内部数据一致。

2.3. 系统架构

从下向上来看

  • 最底层对资金账务系统的流水进行采集作为记账凭证。
  • 准实时核算层根据记账凭证记分户账和总账,并进行会计核对,核对结果上报各安全平台,记账数据以文件形式落盘。
  • T1 核算层处理准实时核算层余额文件,同样根据会计原理进行记账与核对,生成日终数据,作为会计报表与监管数据的基础数据长期存储。
  • 最上层对外输出各类会计报表和会计数据供各财务系统和业务系统用于营业分析,数据验证、业务对账等。

2.4. 挑战及应对

2.4.1. 如何实现精准比对两类余额一致性

财付通资金账务系统的账户余额是在一条记录上进行更新,当用户一直发生交易时,分户核对每次采集到的账户余额快照都不相同,那么如何确定在何时进行核对?

  • 以下图为例,假设分户核对在核对周期 1 采集到了用户 a 的流水版本 1,2,3,同时采集到了用户 a 的余额快照,并且快照中标识了该账户的 a 余额版本是 2,那么就可以确定周期 1 用户 a 的核对范围为[ver1,ver2],计算出本周期会计期末余额版本是 ver2,与资金期末余额版本 ver2 进行核对,同时会计期末余额版本 ver2 将作为下一周期的会计期初余额参与下一周期的核对。

财付通资金账务系统记账在进行一次资金操作时,会将此次交易的事务号更新到余额表中,根据这个事务号,可以找到此次交易的资金流水,并且资金账务系统事务保证对同一个账户,该账户进行资金操作的顺序一定与自增流水号(单实例唯一)的递增顺序相同。基于以上两个特性,分户核对每次从资金账务系统采集一轮账户余额和流水,都可以确定这次采集余额到上次采集余额之间流水的范围。会计分户依据这个增量范围的流水登记分户余额,再和资金账户余额进行比对。这样就可以准实时进行分户核对,稽核资金账户余额、流水的一致性和连续性了。

2.4.2. 性能挑战
2.4.2.1. 核对时效

传统会计系统一般采用实时记账,日终核对的模式。若真实发生账户余额被篡改,或是给用户入错账的情况,用户可以马上进行提现,资金一旦离开财付通将很难被追回,T+1 的核对时效显然无法满足需求。为了更及时的对资金账务数据进行稽核,保障资金安全,财付通会计核算系统使用实时记账,实时核对的模式。本章节将介绍在财付通海量用户天量交易的情况下,会计核算系统如何做到分钟级核对时效。

由于分户核对仅依赖账户的余额与流水,所以很容易能想到可根据资金账务系统的部署情况来拆解任务进行核对,理论上最小能拆解到单账户核对的维度,在预算足够的情况下可以无限进行平行扩展。而总账核对,则必须获取到账期内所有的流水数据,才可以进行核对,虽然可以并发拉取,但随着数据量的增长,单机的性能迟早会到达极限。会计核算系统将总账核对拆分为两个阶段,将数据量级减少到千级

  • 独立可并发的数据汇总阶段:分户核对在记分户账的同时,会将拉取到的所有流水数据按账期进行汇总,并将汇总信息录入数据库中。
  • 汇聚数据核对阶段:总账核对程序对汇总数据进行扫描,将同一个账期的数据进行再次汇总
2.4.2.2. 多级存储

会计核算系统如果全部采用数据库存储,海量账户需要达到分钟级别的记账,将产生非常大的机器成本。为了平衡记账目标与成本,会计核算系统内运用多类存储介质和存储系统。实时会计分户账数据是记录在本地的内存中,为了解决程序异常导致内存中数据丢失的问题,系统内增加了一级存储,每小时会将内存中的数据写入文件保存在本地磁盘中,为了避免单机异常,会有同步程序把本地的余额文件数据定期上传到远端的 HDFS 集群中进行长期保存。通过这种方式,在控制了成本的情况下,解决了记账带来的存储压力,也保证了系统的可用性。

2.4.2.3. IO 效率

会计核算系统的会计账数据,最终会经过 T+1 子系统生成日终分户数据和财付通营业总账报表存储在 DB 中,提供给财务与各个业务查询。由于会计数据按照监管要求需要长期存储 5 年,归档系统会对数据库中的 T+1 会计账数据进行归档并存储在 HDFS 中。随着财付通业务发展,账户数量增长迅速,T+1 子系统运行耗时增长到 2 小时以上,db 写入性能成为瓶颈,而财付通营业总账报表生成时间过晚会影响到后续业务。对比 MYSQL 数据库, HDFS 设计为大数据场景下存储海量数据,于是 T+1 会计核算子系统将写入数据库和 HDFS 顺序调换,将日终余额数据文件上传到 HDFS 上,比按行写入 MYSQL 在 IO 效率上更高,快速生成营业总账结果,再将日终余额数据异步导入数据库供业务查询,运行时间下降 75%。

2.4.3. 可用性挑战

会计核算系统作为一个准实时系统,当出现故障时,需要具备自动切换,快速恢复的容灾能力。

  • 对于常驻进程,会计核算的任务调度程序会实时监控本机进程,如果单进程异常退出,会在本机重新拉起。任务调度本身接入了分布式调度平台,复用了分布式调度平台对于常驻进程的监控和切换能力,当出现单机故障时,分布式调度平台将在配置的备机中把任务调度程序重新拉起,而任务调度程序在备机启动后监控到本机核对进程不存在,会在备机把所有的核对进程拉起,最终完成核算系统的切换。

  • 对于非常驻类的定时进程,通过任务调度平台调度管理,使用抢占式调度,当一台机器出现异常时,任务将被另一台正常脚本机上的 agent 调起。若任务已在故障脚本机调起,则调度平台会监控到该任务超时未结束,会重新将任务置为可调度的状态,此时该任务将被在正常的脚本机上重新调起。

2.4.4. 系统安全挑战

会计核算系统作为财付通内部资金安全的最后一道防线,对系统内部数据的安全和准确性要求非常高,系统内分别通过事前的校验,事中的约束,以及事后的检查来确保会计数据的安全。

编号措施说明
事前,对数据源完整性检查- 校验采集数据连续性,防漏防重
②③事中,数据防篡改- 生成数据签名并加密存储
事后,外部约束- 备付金系统与外部银行账户进行资金核算
事后,数据一致性检查- 对全链路落地的每一份数据进行一致性检查
2.4.5. 小结

会计核算系统性能上具备百万笔/秒记账能力,分钟级核对能力,容灾上全链路具备自动容灾切换能力,数据安全上全链路数据防错,防漏,防篡改,作为财付通系统内部资金安全最后一道防线,稽核财付通系统亿万资金安全。


成果
性能百万笔/秒记账能力,分钟级核对能力
容灾全链路自动容灾切换能力
安全全链路数据防错,防漏,防篡改

3. 思考

财付通海量账户,进行全量核对意味着一次完整的核对所需的时间是非常长的,会导致无法达到预期的核对时效。但是如果只是对发生了变化的账户进行核对,又有可能发生遗漏,比如有人篡改了余额但没有更新余额变动时间,也不做任何交易不产生动账流水,大家不妨思考一下你们会采用何种技术方案解决这个问题。

抽奖红包封面

点击下面卡片进入公众号后台

回复「1024」 即可参与


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5ODYwMjI2MA==&mid=2649775165&idx=1&sn=8f347fa821dec1aec776d6c9cae25d3b&chksm=becccf4689bb465096e8275712977a888521ebc5360461fafaf2b6cd6819da2c17ab216f9921#rd
如有侵权请联系:admin#unsafe.sh