资金账户系统的设计
👉目录
1 什么是账户
2 什么是资金账户
3 实现一个支付资金账户系统
4 总结
01
账户余额:账户中的资金数目,这个账户有多少钱; 账户流水:这个账户资金进进出出的明细记录,任何余额的变动都需要记录流水; 交易凭证:用来记录交易过程的信息。
1.1 余额
账户 ID,这个 ID 有的平台会有编码规则,比如某些位用来区分个人或者商户,区分币种以及校验位等。 币种。 余额,一般使用币种最小单位。 账户状态,比如是正常态、支付或者冻结等。 余额版本号,这个字段非常重要,体现了余额的变化过程,是与流水进行关联的关键。
1.2 流水
流水 ID。 凭证 ID,一般是业务单号(如订单 ID、退款单 ID 等),也就是下面凭证中的 ID。 发生金额。 发生币种。 起始余额。 终止余额。 余额版本号,与余额信息中的版本号字段对应。 资金方向,标识是入账还是出账。 源账户 ID。 目的账户 ID。 交易时间戳。
在设计账户流水时,有几个重要的原则必须遵守:
流水记录只能新增,一旦记录成功不允许修改和删除。即使是由于正当原因需要取消一笔已经完成的交易,也不应该去删除交易流水。正确的做法是再记录一笔“取消交易”的流水。 流水中的余额版本号必须是连续递增的,我们需要用余额版本号来确定交易的先后顺序(注意:不是通过交易时间戳)。
1.3 凭证
02
2.1 资金账户系统的目的
2.2 资金账户系统的构成
03
3.1 重要原则
3.1.1 复式记账法
3.1.2 借贷记账法
3.1.3 账户的基本操作
3.2 我们的设计与实现
3.2.1 资金流设计
3.2.2 存储选型
高性能。这样才能承受高并发的请求流量。 数据强一致。保证切换不同副本的情况下数据0丢失0出错。 支持透明分库分表。在分布式形态下,用户看到的逻辑表的实际物理存储可能是被打散分布到不同的物理节点上。希望做到对业务完全透明。这样一来作为开发者不需要关心分库分表细节。 支持不停机的容量弹性扩展。如果性能或容量不足以支撑业务发展时会自动扩展,升级过程中,开发者无需关心分布式系统内的数据迁移,均衡和路由切换。 支持跨区容灾、同城双活、跨城容灾等,故障自动切换其他副本,自动恢复,确保99.999%的可用性。 最好有配套的分布式事务解决方案。
基于 MySQL 的方案。 基于 NoSQL 型分布式 KV 存储的方案。 基于 TDSQL 的方案。
3.2.3 架构设计
3.3 重难点
3.4 资金安全建设
3.4.1 STRIDE 模型
Spoofing(仿冒) Tampering(篡改) Repudiation(抵赖) Information disclosure(信息泄露) Denial of Service(拒绝服务) Elevation of Privilege(特权提升)
3.4.2 权限控制
票据校验:
自主式访问控制:主体对其拥有的数据具有绝对控制权,也可以授权别人访问和操作。适用于简单的业务场景。 强制访问控制:系统将对数据的操作分为不同的级别,强制要求对不同级别数据的访问和操作具有不同级别的鉴权。适用于对数据安全有极高要求的系统。 基于角色的访问控制:抽象出不同角色,赋予不同角色下用户以不同权限。适用于权限划分复杂的业务场景。
商户向商户 API 发起请求时需要带 API 密钥签名或证书签名,我们的 API 服务会验证这个签名,验证通过才会执行后面的业务逻辑。
商户在商户平台登录后,每次请求前会自动通过 PHP 的 hook 验证登录态,验证成功才会执行具体的业务逻辑。
模块认证:
3.4.3 防篡改
3.4.4 密钥防泄漏
基于硬件加密机的真随机数。
密钥的权限细粒度管控。
密钥的自动轮换。
密钥生命周期的管理(创建、开启、禁用、计划删除、销毁等)。
自有密钥的导入。
多级密钥管理。
3.4.5 密钥防泄漏
3.4.6 另外一个角度
3.4.7 幂等性设计
3.4.8 余额流水的一致性
3.4.9 分布式事务与最终一致性
3.4.10 全方位的对账和审计
一致性:系统间关键数据一致,包含商户、账户、金额、单号、属性、状态等。 正确性:业务规则的正确性,如收支分离实收手续费。 总分核对:系统内总分数据一致,包含冻结总分(退、结、分)和手续费总分。 及时性:业务单据超期未到终态,如解冻单、分账明细单、退款单。
逐层审计对账(由上层驱动)。
流水连续性审计对账。
余额正确性审计对账。
内部银行账户和外部银行流水账单审计对账。
3.4.11 会计核算体系
3.4.12 研发流程规范
严格的现网机器和数据库权限管控。
双人代码 CR。
完整的单元测试和接口测试覆盖。
只能通过发布系统执行发布。
3.5 可用性建设
3.5.1 程序(节点)可用性
在私有网络中运行,可以使用自己的安全组和网络 ACL,不与其他业务混布,提供了高隔离水平。
负载均衡,自动分配流量,自动添加和删除容器。
故障自动恢复出问题的节点。
自带完备的监控。
3.5.2 服务可用性
限流限频
热 key 问题
只记录流水不记余额。
合并入账。
多账户。
功能分离型多账户,出入帐功能分离,有的子账户承载入帐,有的子账户承载出账,有的承载两者。 功能完整性多账户,所有的分账户都同时承载出账和入帐。
分布式事务带来的性能问题
3.5.3 存储可用性
高性能。这样才能承受高并发的请求流量。
数据强一致。保证切换不同副本的情况下数据0丢失0出错。
支持透明分库分表。在分布式形态下,用户看到的逻辑表的实际物理存储可能是被打散分布到不同的物理节点上。希望做到对业务完全透明。这样一来作为开发者不需要关心分库分表细节。
支持不停机的容量弹性扩展。如果性能或容量不足以支撑业务发展时,升级过程中,开发者无需关心分布式系统内的数据迁移,均衡和路由切换。
支持跨区容灾、同城双活、跨城容灾等,故障自动切换其他副本,自动恢复,确保99.999%的可用性。
最好有配套的分布式事务解决方案。
3.5.4 压测
04
📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~
(长按图片立即扫码)