论一小时内对完30亿美金账务的技术实现

一小时对完30亿美金账务的技术方案

图片

图片

👉目录

1 对账的基本原理

2 对账流程

3 流式对账 Streaming Reconciliation

4 其他补充说明

对账是资金安全保障中的重要环节,但你是否有思考过对账是怎么进行的?特别是在超大型项目中,一天需要处理等同数百亿USD的资金流水。今天我就来分享一下在超大型项目中对账怎么做。

我们再明确一下问题:每小时需要对账30亿USD,假如平均每笔交易金额为30USD,也就是每小时需要对账1亿条,换算一下TPS(每秒事务数)是27777。这样的对账系统应该怎么设计?

关注腾讯云开发者,一手技术干货提前解锁👇

鹅厂程序员面对面直播继续,这次将邀请鹅厂大佬讲讲自己从大专到腾讯的心路历程。更有蛇年公仔等精美周边等你来拿,记得提前预约直播~👇

01

对账的基本原理

在正式开始之前,还是有必要简单说明一下对账原理。以小帅超市为例进行说明,小帅开了一家“小帅超市”,每天顾客络绎不绝。顾客多数使用的微信或支付宝支付,还有少数刷卡和现金。小帅超市8月1日的营业收入,正常需要8月2日(T+1)扣除手续费后结算到账。

这是小帅的收银系统记录下来的交易记录:

交易时间

交易金额

支付方式

交易订单号

渠道订单号

2025/8/1 10:00:00

30

微信

1000000001

6660000001

2025/8/1 10:00:01

50

微信

1000000002

6660000002

2025/8/1 10:00:02

60

支付宝

1000000003

7770000003

2025/8/1 10:00:03

70

现金

1000000004

2025/8/1 10:00:03

...

...

...

...

所谓对账,就是要保证8月1日的营业收入,扣除掉渠道手续费后,与8月2日的实际到账资金相等。如果不相等,还需要找出是哪些交易存在差异。显然我们需要做两轮比对:

  1. 实际资金对账:8月1日的应收资金,和8月2日实际到账资金对比

  2. 交易明细对账:每一笔交易都要与对方的交易明细进行比对,以发现明细级别的差异,这里的对方指的是支付渠道

02

对账流程

很显然上面的资金对账相对更简单,只需比对一个值就可以了。我们重点聊一聊明细对账,按照常规思路会把对账设计为一个批处理系统,每个步骤都是一个批处理任务:

明细对账流程

如果数据量不大,也没有时效性要求,这么设计完全可以。但我们现在要处理的是每小时30亿的资金,还需要及时完成对账以免影响当日的账务核算。因此今天来介绍另一种流式对账引擎。

03

流式对账 Streaming Reconciliation

流式对账的思路是去除定时任务依赖,减少等待时间,通过并行流提高并发,每个“流”可以细到单独一笔交易,串联起整个对账过程。

流式对账引擎

一共需要多少台机器

我们需要尽可能压榨所有服务器的算力,以8C16G的配置来说,目标是每一笔对账50ms内完成(包括计算的时间和读写数据的时间),8核最大并发数就是160,如果用上Java21的虚拟线程技术,并发可以达到300~350,以保守300来估算,27777的TPS,需要27777/300≈93台机器。

数据库的配置则要高一些,一般需要用到16C32G,对账的所有数据库操作都要求必须是唯一键查询,这样单库可以支撑3000+并发,我们可以把数据分到10个库,每个库10张表,一共100个分表。

清算文件拆分

首先1亿条记录的文件只靠单线程解析太慢了,需要拆分为10个小文件并行处理。由于我们的目标是TPS达到27777,每个小文件每秒数据加载分发量控制在2800条左右。

最好能够把数据分发速率做成可配置的,便于进行灰度验证和后续调整。

流水解析

流水解析的目标是把文件中的每一行数据,解析为清算机构的交易流水,这个名字太长,简称为“机构流水”。流水解析的作用是把来自不同机构或渠道的流水解析为标准格式,识别业务类型,提取出用于做对账匹配的信息。 流水解析需要感知不同的渠道特性,如果对接的渠道较多,可以单独新增一层渠道服务,用于做内外桥接。

执行对账

流水解析完就可以实时分发给对账引擎层,对账引擎就是由93台机器组成的大集群,本身是无状态的,因此任意一台机器都可以用于执行对账。其过程就是把机构流水和我方交易流水进行比对,记录对账结果。 在交易明细层面,通常会跟对方约定好用于对账的字段,可以通过唯一键匹配来查找我方流水。

对账结果有以下几种:

  1. 未找到我方流水;

  2. 找到我方流水,但已对完(机构流水重复);

  3. 找到我方流水,金额不一致;

  4. 找到我方流水,金额一致。

结果汇总

每一条流水对账完成后,就可以提交进行结果汇总。因为数据量较大,可以把汇总过程拆分为2级。

第一级汇总可以根据时间分片,也可以固定条数;第二级根据业务特性汇总出完整结果,例如可以根据业务类型汇总,也可以根据对账结果类型汇总。如果有必要,也可以增加第三级汇总。

对账结果处理

汇总的结果需要进一步处置,但由于不在主流程内,可以异步进行:

  1. 进行相应的记账,不论对账是否存在差异,都需要在内部账务上进行登记,涉及到渠道费用的,也需要记录。

  2. 除了上述第4种情况外,其他都属于差异,还需要进入对账差异处理流程。

04

其他补充说明

  1. 网络带宽

    包含1亿条记录的文件,大小大约15~25GB左右,为保证数据顺利传输,带宽应至少在50Mbps以上。

  2. 流水分发策略

    流水分发可以用RPC,也可以用MQ。框架最好能做到根据负载情况自动调整,把请求优先分发到负载较低的节点上。这样可以最大程度地利用系统资源,提高系统的吞吐量。

  3. 断点处理

    清算明细文件较大,如果解析过程中发生中断重新开始解析,在时效性上就无法达到要求。可以在缓存中记录下当前的解析进度,恢复时就可以从断点处继续处理。

欢迎关注作者公众号,了解跟多支付相关技术👇

-End-

原创作者|Louis

感谢你读到这里,不如关注一下?👇

📢📢来抢开发者限席名额!点击下方图片直达👇

图片

如果必须删掉一个对账环节来“保命上线”,你敢动哪一步?欢迎评论留言补充。我们将选取1则优质的评论,送出腾讯云定制文件袋套装1个(见下图)。8月20日中午12点开奖。

图片

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值