作者:shuangchen,腾讯 FiT 线后台开发工程师
财付通作为业界领先的第三方支付公司,一直致力于为互联网用户和各类企业提供安全便捷的在线支付服务,本文将介绍财付通如何通过会计核算系统来保障财付通亿万资金安全。
财付通作为业界领先的第三方支付公司,一直致力于为互联网用户和各类企业提供安全便捷的在线支付服务。财付通为用户或商户创建支付账户,用于承载用户或商户资金余额以及余额变动情况。财付通资金账务系统中,按账户属性分为现金账户、交易账户和内部银行账户。
财付通资金账务系统采用借贷记账法,借贷记账是复式记账法的一种,它是以“借”,“贷”为记账符号,对于每一笔经济业务,都用相等的金额在交易双方账户中进行登记,全面系统地反映交易要素增减变化的一种记账方法。
交易驱动交易参与双方账户余额变动,账户余额变动的同时记录账户余额变动流水,反映每次余额变动的过程。
以常见交易类型充值,支付,提现为例,描述财付通资金账务系统如何进行记账,以及如何理解记账符号。
财付通资金账务系统管理海量账户数据,处理天量交易数据,涉及金额巨大,试想如果出现了以下场景:
以上记账异常的场景都会带来资金损失,本文将详细介绍财付通会计核算系统如何通过记录会计账与会计核对来稽核资金账,保障财付通亿万资金安全。
会计核算系统包含记录会计账与会计核对两部分。
会计账包含了会计分户账和会计总账,会计核算系统从资金账务系统采集流水编制记账凭证,根据记账凭证驱动分户账和总账记账,会计账会给财务和业务提供会计报表,同时也是会计核对的数据基础。
会计核对包含下面几个公式:
分户核对:资金账户余额 = 会计账分户余额
总账核对:借方发生额 = 贷方发生额,资产 = 负债
总分核对:资产总账余额 = ∑ 资产类分户余额,负债总账余额 = ∑ 负债类账户余额
下图简要描述了当资金账务系统对“现金账户 C 充值 100 元”,“现金账户 C 向交易账户 B 支付 100 元”进行记账时,资金账与会计账的变化,以及会计核对中核对要素之间的关系。
本章将通过详细介绍会计核对原理来描述财付通会计核算系统如何通过会计账和会计核对来稽核资金账务系统记账准确性。
会计期初余额 + 发生额 = 会计期末余额
设每个新账户会计期初余额=0,持续获取该账户的所有交易的发生额,计算会计期末余额并记录,作为下一周期的会计期初余额,以账户 A 为例,该账户在会计分户账中记录为
账户 ID | 账期 | 当前账期期初余额 | 当前账期借方发生额 | 当前账期贷方发生额 | 当前账期期末余额 |
---|---|---|---|---|---|
A | 账期 1 | 0 | 10 | 30 | 20 |
A | 账期 2 | 20 | 30 | 100 | 90 |
A | 账期 3 | 90 | 50 | 10 | 50 |
A | ... |
资金账户期初余额 = 会计分户期初余额
资金账户期末余额 = 会计分户期末余额
假设发生了 1.2 节中的场景 1:A 觉得余额太少了,给自己的账户余额加了 10000 元,那么分户核对将发现异常: 会计账期末余额 90 != 资金账期末余额 10090。
① 借方发生额 = 贷方发生额,可变形为 Σ交易账户借方发生额 + Σ现金账户借方发生额 + Σ内部银行账户借方发生额 = Σ交易账户贷方发生额 + Σ现金账户贷方发生额 + Σ内部银行账户贷方发生额,称为发生额试算平衡
② 资产 = 负债,可变形为 Σ内部银行分户余额 = Σ交易分户余额 + Σ现金分户余额,称为余额试算平衡
假设账期 1 发生了三笔交易,核对示例如下:
若发生了 1.2 节中的场景 2:A 支付给 B 100 元,A 扣钱了,B 未加钱和场景 3:A 支付给 B 100 元,A 扣了 100 元,A 加了 50 元,都会触发总账核对异常。
以场景 2 为例,用户 A 向商户 B 支付 100 元,商户 B 未收款:
明细总账核对 总账记账汇总当前账期的所有交易进行记账,当出现异常时,只能确定到某核对区间存在借贷不相等的情况,无法定位到具体的交易,所以在总账核对的基础上,增加明细核对,对该区间所有的交易,对每个交易内进行发生额试算平衡,可以快速定位到出现异常的交易。
依旧以场景 2 为例,总账核对异常后,此时对账期 1 内所有交易进行明细级别总账核对,定位到具体异常的交易。
保证总账各科目余额应与同科目各分户账余额相同,科目总账余额必须等于其对应的分户账相应余额总和,以此验证会计账内部数据一致。
从下向上来看
财付通资金账务系统的账户余额是在一条记录上进行更新,当用户一直发生交易时,分户核对每次采集到的账户余额快照都不相同,那么如何确定在何时进行核对?
以下图为例,假设分户核对在核对周期 1 采集到了用户 a 的流水版本 1,2,3,同时采集到了用户 a 的余额快照,并且快照中标识了该账户的 a 余额版本是 2,那么就可以确定周期 1 用户 a 的核对范围为[ver1,ver2],计算出本周期会计期末余额版本是 ver2,与资金期末余额版本 ver2 进行核对,同时会计期末余额版本 ver2 将作为下一周期的会计期初余额参与下一周期的核对。
财付通资金账务系统记账在进行一次资金操作时,会将此次交易的事务号更新到余额表中,根据这个事务号,可以找到此次交易的资金流水,并且资金账务系统事务保证对同一个账户,该账户进行资金操作的顺序一定与自增流水号(单实例唯一)的递增顺序相同。基于以上两个特性,分户核对每次从资金账务系统采集一轮账户余额和流水,都可以确定这次采集余额到上次采集余额之间流水的范围。会计分户依据这个增量范围的流水登记分户余额,再和资金账户余额进行比对。这样就可以准实时进行分户核对,稽核资金账户余额、流水的一致性和连续性了。
传统会计系统一般采用实时记账,日终核对的模式。若真实发生账户余额被篡改,或是给用户入错账的情况,用户可以马上进行提现,资金一旦离开财付通将很难被追回,T+1 的核对时效显然无法满足需求。为了更及时的对资金账务数据进行稽核,保障资金安全,财付通会计核算系统使用实时记账,实时核对的模式。本章节将介绍在财付通海量用户天量交易的情况下,会计核算系统如何做到分钟级核对时效。
由于分户核对仅依赖账户的余额与流水,所以很容易能想到可根据资金账务系统的部署情况来拆解任务进行核对,理论上最小能拆解到单账户核对的维度,在预算足够的情况下可以无限进行平行扩展。而总账核对,则必须获取到账期内所有的流水数据,才可以进行核对,虽然可以并发拉取,但随着数据量的增长,单机的性能迟早会到达极限。会计核算系统将总账核对拆分为两个阶段,将数据量级减少到千级
会计核算系统如果全部采用数据库存储,海量账户需要达到分钟级别的记账,将产生非常大的机器成本。为了平衡记账目标与成本,会计核算系统内运用多类存储介质和存储系统。实时会计分户账数据是记录在本地的内存中,为了解决程序异常导致内存中数据丢失的问题,系统内增加了一级存储,每小时会将内存中的数据写入文件保存在本地磁盘中,为了避免单机异常,会有同步程序把本地的余额文件数据定期上传到远端的 HDFS 集群中进行长期保存。通过这种方式,在控制了成本的情况下,解决了记账带来的存储压力,也保证了系统的可用性。
会计核算系统的会计账数据,最终会经过 T+1 子系统生成日终分户数据和财付通营业总账报表存储在 DB 中,提供给财务与各个业务查询。由于会计数据按照监管要求需要长期存储 5 年,归档系统会对数据库中的 T+1 会计账数据进行归档并存储在 HDFS 中。随着财付通业务发展,账户数量增长迅速,T+1 子系统运行耗时增长到 2 小时以上,db 写入性能成为瓶颈,而财付通营业总账报表生成时间过晚会影响到后续业务。对比 MYSQL 数据库, HDFS 设计为大数据场景下存储海量数据,于是 T+1 会计核算子系统将写入数据库和 HDFS 顺序调换,将日终余额数据文件上传到 HDFS 上,比按行写入 MYSQL 在 IO 效率上更高,快速生成营业总账结果,再将日终余额数据异步导入数据库供业务查询,运行时间下降 75%。
会计核算系统作为一个准实时系统,当出现故障时,需要具备自动切换,快速恢复的容灾能力。
对于常驻进程,会计核算的任务调度程序会实时监控本机进程,如果单进程异常退出,会在本机重新拉起。任务调度本身接入了分布式调度平台,复用了分布式调度平台对于常驻进程的监控和切换能力,当出现单机故障时,分布式调度平台将在配置的备机中把任务调度程序重新拉起,而任务调度程序在备机启动后监控到本机核对进程不存在,会在备机把所有的核对进程拉起,最终完成核算系统的切换。
对于非常驻类的定时进程,通过任务调度平台调度管理,使用抢占式调度,当一台机器出现异常时,任务将被另一台正常脚本机上的 agent 调起。若任务已在故障脚本机调起,则调度平台会监控到该任务超时未结束,会重新将任务置为可调度的状态,此时该任务将被在正常的脚本机上重新调起。
会计核算系统作为财付通内部资金安全的最后一道防线,对系统内部数据的安全和准确性要求非常高,系统内分别通过事前的校验,事中的约束,以及事后的检查来确保会计数据的安全。
编号 | 措施 | 说明 |
---|---|---|
① | 事前,对数据源完整性检查 | - 校验采集数据连续性,防漏防重 |
②③ | 事中,数据防篡改 | - 生成数据签名并加密存储 |
④ | 事后,外部约束 | - 备付金系统与外部银行账户进行资金核算 |
⑤ | 事后,数据一致性检查 | - 对全链路落地的每一份数据进行一致性检查 |
会计核算系统性能上具备百万笔/秒记账能力,分钟级核对能力,容灾上全链路具备自动容灾切换能力,数据安全上全链路数据防错,防漏,防篡改,作为财付通系统内部资金安全最后一道防线,稽核财付通系统亿万资金安全。
成果 | |
---|---|
性能 | 百万笔/秒记账能力,分钟级核对能力 |
容灾 | 全链路自动容灾切换能力 |
安全 | 全链路数据防错,防漏,防篡改 |
财付通海量账户,进行全量核对意味着一次完整的核对所需的时间是非常长的,会导致无法达到预期的核对时效。但是如果只是对发生了变化的账户进行核对,又有可能发生遗漏,比如有人篡改了余额但没有更新余额变动时间,也不做任何交易不产生动账流水,大家不妨思考一下你们会采用何种技术方案解决这个问题。
抽奖红包封面
点击下面卡片进入公众号后台
回复「1024」 即可参与