写点什么

百度交易中台之资产系统架构浅析

作者:百度Geek说
  • 2022 年 9 月 22 日
    上海
  • 本文字数:4833 字

    阅读完需:约 16 分钟


作者 | 小黑哥


导读:百度交易中台资产系统是基于百度收银台和交易系统下,对公司内 C 端个人现金、虚拟类资产(虚拟币等)业务进行收拢、管理,提供安全可靠且符合国家清算规范的用户资产管理能力。交易中台资产系统基于现有交易中台部分能力,一站式解决业务方对用户资产管理、平台分账、对账、财报等问题,快速支持资产类业务发展。

全文 5085 字,预计阅读时间 13 分钟。

一、系统介绍

百度交易中台支持百度集团内部的代收代付 B2C 业务,随着集团业务发展,存在 C 端用户比如好看视频用户打赏给 C 端作者的场景,传统的 B2C 模式已无法满足,于是我们提出了 C2C 支付模式。



△图 1-1 支付模式


C2C 模式即 C 端用户与 C 端用户进行交易的模式,其中最重要的一个组成部分,就是需要一个系统能够承接 C 端用户的相关资产信息,且可以对其进行管理,于是我们设计了资产系统进行承接。百度交易中台资产系统是基于百度收银台和交易系统下,对百度内 C 端个人现金、虚拟类资产(虚拟币等)业务进行收拢、管理(充值、消费、退款、赠送、提现、计税等),提供安全可靠且符合国家清算规范的完整用户资产管理能力。交易中台资产系统基于现有交易中台部分能力,一站式解决业务方对用户资产管理、平台分账、对账、财报等问题,快速支持资产类业务发展。

二、主要业务场景

目前,交易中台资产系统已接入好看视频打赏、百度知道问一问、法律、百家号百+币等 20+业务线,主要支持虚拟币类、现金类、资产类三种核心场景:



△图 2-1 夸夸币(虚拟币类)


虚拟币类:主要服务于百度内虚拟币类相关业务,按照业务线币种隔离,支持单币种多维度账户:iOS 账户、Android 账户,充值户、赠送户;支持账户创建、资产增加、资产扣减等基础账户能力;具备购买、退款、转账、消费、逆向消费、余额查询、流水查询等通用业务能力;支持跨业务线币种转换能力;支持币过期回收。



△图 2-2 现金类(好看赞赏)


现金类:主要服务于百度内容变现相关产品线,侧重于现金类管理。资产系统提供了用户从支付到消费再到结算、计税、提现的整体流程;多账户,支持多维度账户:iOS 账户、Android 账户;支持劳务报酬、偶然所得等计税方式;按月结算(次月、季度、指定日期等)、其他(按周、天结算)结算周期进行自动结算;支持资产自动结算、业务方指定结算;支持支付宝、微信、度小满、银行卡多种提现方式。



△图 2-3 资产类(我的返现)


资产类:主要服务于百度内容变现相关产品线,侧重于资产管理。资产系统提供了用户资产的管理能力;多账户,支持多维度账户:iOS 账户、Android 账户;支持业务方请求控制结算。

三、资产业务流程

现金类资产是典型的业务场景,故如下解读我们主要采用现金类资产流程进行介绍。接入交易中台资产系统的业务方,为用户提供服务,用户在服务内进行相关操作,例如充值、打赏、消费等,业务方接到用户请求后调用交易中台交易系统完成支付、退款等操作,也可直接调用资产系统完成充值、打赏等操作,资产系统根据业务方的配置完成相关处理。业务方可配置定时提现或者由用户主动发起提现,支持支付宝、微信、度小满、银行卡等多种提现方式。



△图 3-1 资产业务流程图

四、系统详细拆解

资产系统承接用户核心资产信息,在系统搭建时面临着诸多挑战,主要有数据一致性、记账准确、热点账户高吞吐。针对数据一致性挑战,我们采用了一致性保障方案进行解决;对于记账准确,我们采用了复式记账进行解决;对于热点账户,我们设计了热点账户方案加以解决。下面分别介绍方案细节。


4.1 资产一致性保障


保障用户资产数据一致性,是个基础必要能力,也是一个难点。我们从资产变更的环节入手,从如下两个方面确保资产一致性:


①支付一致性:由于历史包袱问题,交易系统支付接口四参数验签,数据存在被篡改风险。如果增减参数,且该参数参与验签,则整个交易链路都需要修改,成本高、风险大。针对此问题,我们对支付接口升级,采用全参数验签,支付逻辑复用进行解决。


②变更一致性:系统内、系统间数据需要保证一致性,我们采用最终一致性、数据对账来解决。


对于用户类型,我们区分为热点账户和非热点账户。热点账户为频繁进行余额操作的账户,比如运营账户。对于非热点账户操作时,我们先对其加分布式锁,加锁成功后再进行后续数据变更,以确保数据变更准确。对于热点账户,我们将其余额数据放入分布式缓存中,数据操作时,需确保操作记录写入成功后再进行操作缓存数据,启动定时任务批次同步缓存数据更新至 db,具体可以参见下文第 3 章节热点账户。



△图 4-1 转账提现一致性


针对最终一致性,我们采用基于可靠消息队列模式,用户发起资金提现时记录临时状态,发送消息通知下游系统进行提现,下游提现系统按用户配置的提现方式进行提现,完成后下游提现系统 ack 资产系统,资产系统变更为完结状态。如果中间环节失败,利用接口幂等进行内部重试。



△图 4-2 最终一致性


为了防止重试未解决或者其他因素导致的数据不一致问题,我们搭建一致性服务,采用数据对账进行解决。一致性服务基于开源中间件 canal,采集上下游系统 db binlog 后发布消息队列,对账系统进行消费消息、对账、写入 db,如果发现问题,进行告警或者利用修复接口进行数据修复。一致性服务在系统间准实时对账,异步采集无侵入。一致性服务对账记录报错 7 日内的数据,定时清理超期数据,以保证数据量不会过大,不影响数据库性能。



△图 4-3 数据对账


4.2 复式记账


为了确保记账准确,我们引入了财务复式记账,即扣减账户 A 金额,增加 B 账户金额,操作整体原子性,接口幂等,账户变更可追溯,确保用户账户操作借贷平衡。


  • 用户资产的使用包括了资金的出账方,资金入账方;

  • 原则:有扣必有增 (充值和提现除外) 每个币种下 sum(扣款) = sum(入账);

  • 每笔转账原子操作:账户余额计数器变动+新增一条账户变动明细(明细中包括 浮动数量 和 操作后余额);

  • 设立业务平台公共资金池。

  • 记录用户资产流传,check 用户资产的准确性


为了确保用户资产变更时账户信息准确、可对齐,我们设计了多种账户类型,资产账户类型主要包括打赏现金账户、被打赏通用账户、被打赏提现欠款账户、被打赏提现账户四类账户类型。每个变更环节采用如下记账方式:



接下来我们看下各个账户是如何进行进出账计算的。


打赏现金账户:用户打赏充值时,进行进账,用户打赏时进行出账。


被打赏通用账户:用户打赏时,进行进账,用户退款时进行出账;该账户承接账期内结算金额,即该账户账期内正向流水全部总额减去账期内负向(退款)流水总额;账期结算时,进行出账扣款。


被打赏提现账户:账期结算时,该账户进行进账充值,定期提现后,进行出账扣款。


被打赏提现欠款账户:上一账期的流水退款,导致下一账期被打赏通用账户不够扣款时的记账,会在后续账期结算时进行补计。


结合如下示例,我们看下账期结算:



①如 4 月份,2 条入账和 1 条出账,通用账户操作记录 3 条明细,4 月底时通用账户余额为 1500,可提现账户余额和提现欠款账户挂账都为 0;5 月份又有 2 笔入账,计入通用账户余额;


②05.20 账期结算 4 月份整月金额 1500,通用账户余额出账 1500,可提现账户入账 1500,05.21 发起提现,可提现账户出账 1500;


③6 月份 1 条出账和 1 条入账,06.20 账期结算 5 月份整月金额 2000,但此时通用账户余额只有 1200,故只能出账 1200,提现欠款账户入账 800,可提现账户入账 1200,06.21 发起提现,可提现账户出账 1200;


④7 月份入账 4 条,07.20 账期结算 6 月份整月金额 1200,提现欠款账户 800,此时通用账户余额有 4000,故满足提现出账 1200+800,通用账户余额出账 1200,提现欠款账户出账 800,可提现账户入账 2000,07.21 发起提现,可提现账户出账 2000。


4.3 热点账户


上文第 1 章节提到的热点账户,即某个账户会并发的进行账户余额变动;该账户余额会被多个并发转账请求作为竞态资源。主要是偏 B 端类型,例如商户、热门主播、业务线的补齐账户,同时账户数量少、单个账户记账操作并发高、数据量大。在对热点账户操作时,实时记账请求仅插入记账明细、不更新账户余额,并把账户明细标记为未汇总;异步汇总程序,根据标记的“未汇总”账户明细,异步计算出明细的操作后余额和账户余额,异步汇总到账户余额。对于热点账户余额,我们拆分成账面余额、实际余额、缓存余额:


  • 账面余额 :余额表余额

  • 实际余额 :账面余额+未汇总明细余额

  • 缓存余额 :实际余额的即时状态



△图 4-4 热点账户


资产数据存储,我们基于 uid 做的分库分表,具体参见第五章,但热点账户会在数据倾斜问题:存在大量操作记录,导致查询、变更时效率越来越低。对此,我们提出了数据归档的方案,即启动离线归档服务,将热点账户的账户明细数据自动归档转移到归档库中;新建数据库,历史归档数据单独存放。根据账户明细的创建时间,按月归档。


4.4 符合国家一清金融监管


传统的 B2C 支付,就是 B 端商家提供服务,C 端用户购买的模式;这种模式下,B 端商家将资质、银行卡进件到有清算牌照的银行机构进行审核,银行机构可根据资质信息核查其真实性,故可对其信任。但该模式无法适用打赏、虚拟支付这种 C 端用户与 C 端用户间的直接支付方式类型业务需求,主要原因是被打赏、被接收一方同为 C 端用户,银行机构无法对其信息进行真实性核查,存在风险。经由多次与合作机构银行(具备清算牌照)讨论,最终提出个人登记簿方案:增加个人信息进件,在银行开辟个人登记簿模式,审核个人信息通过后开通个人登记簿打款,由银行管理用户信息,即可满足资金一清监管要求。


五、存储设计方案


用户资产流水是交易订单量的 2-5 倍,受限于 MySQL 数据库单机处理能力,故将数据进行拆分,不同的数据放置在不同的机器,便于机器扩容。数据拆分分为两步,第一步进行分库,即将不同表放不同库不同机器上。经过第一步分库后,容量得到了一定的提升。但是分库并不能解决单表容量超过单机限制的问题,随着业务的发展,资产系统中的账户流水表、指令表、账户表逐步遇到了这个问题。


针对账户流水表、指令表、账户表三张表超过单库容量的问题,需要进行分表操作,即将表数据进行拆分。指令表按照业务方订单号生产 shardingKey,账户流水表按照用户 ID 生成 shardingKey,账户表按照用户 ID 分表生成 shardingKey,均为 16 分片、1024 个表。单表数据拆分后,解决了写入的问题。但由于部分特殊业务存在热点账户,就会导致一些核心平台账户(如百+币平台账户)落入的表非常大,一般账户的表非常小,造成比较严重的数据倾斜问题。针对该问题,资产系统采用了归档方式来进行数据整理,将 3 个月之前的数据认为是冷数据,通过定时任务的方式从分布式关系数据库中迁移到历史表中。


解决了写数据的问题,但是如果查询数据不在同一个分片,会带来查询效率的问题(多表聚合查询),同时账户流水表、指令表、账户表分别按不同纬度产生 shardingKey,聚合查询将无从下手。在资产系统中,我们引入了 ES 来解决分表后复杂聚合查询问题。我们采用 canel 读取 MySQL 的 binlog 方式,将 db 数据准实时的同步到 ES 中。然后通过 ES 来支持对外的多纬度、准实时查询需求。


六、结语


基于当前交易中台所接触和前瞻性预料的业务和场景,我们设计了如上资产系统,助力上游业务快速发展。我们的目标是支持全集团所有支付类场景,解决业务方支付、清分、结算、打款等涉及与钱相关的后顾之忧,助力业务、公司健康、快速发展。针对资产系统,存在由于特殊情况有所取舍、折中导致的问题,也存在着因为业务快速发展、变化带来的诸多挑战!我们会逐步打磨、迭代、完善、丰富资产系统的功能,助力集团业务更快、更稳的发展壮大!


————END————


参考资料:


【1】百度交易中台之订单系统架构浅析


【2】百度交易中台之商品推广流程构建以及实现


【3】百度交易中台之钱包系统架构浅析


【4】百度交易中台之账房系统架构浅析


推荐阅读:


流日志轻松应对“10亿级别IP对”复杂场景,实现超大规模混合云网络流量可视化


百度App Android启动性能优化-工具篇


数字人技术在直播场景下的应用


百度工程师教你玩转设计模式(工厂模式)


超大模型工程化实践打磨,百度智能云发布云原生 AI 2.0 方案


前后端数据接口协作提效实践


前端的状态管理与时间旅行:San实践篇


百度App 低端机优化-启动性能优化(概述篇)

发布于: 5 小时前阅读数: 3
用户头像

百度Geek说

关注

百度官方技术账号 2021.01.22 加入

关注我们,带你了解更多百度技术干货。

评论

发布
暂无评论
百度交易中台之资产系统架构浅析_数据库_百度Geek说_InfoQ写作社区