前言
热点账户广泛存在于大商户或明星用户的出入账、营销等场景,是行业普遍存在的技术问题。
账户系统最重要、最基础的系统工作是记账,记账的准确性、及时性和吞吐直接影响着用户的业务体验和资金安全。
一般账务系统对账户的冲扣需要满足以下3点:
1、更新账户表中的账户余额。
2、记录账户明细表中的账户更新前余额,账户更新后余额,操作金额。
3、关联记录单据凭证(引起账户变更的业务因子)方便对账
其中对账户表中的余额更新一般是直接update操作,在高并发下为了保证账户资金安全,我们一般会加锁处理,但这就会影响账户的实时处理。基于此,本章整理业界常用方案,给大家提供解决思路。
方案1:限流控制
既然系统支持不了那么多账户扣减的人,直接把能承载系统之外的请求,拒绝掉。
优点:
实现简单,添加限流器。
缺点:
这个是牺牲用户体验来保障系统性能,支付或者账务处理的失败率会提升。
适用场景:
这种方法可以作为兜底方案,配合其他方案使用,保护数据库和系统的安全的措施是不能缺失的。
方案2:预写日志记账(WAL方式)
在表中插入新数据时,INSERT命令的效率通常比UPDATE要高,因为更新时需要进行大量的数据读取和写回操作,而INSERT命令只涉及到简单的顺序写入操作。
既然账户更新是在数据底层是一个随机操作,那就把先用写入速度更快的插入log操作,然后定时将这些log变为实际更新。
这其实是一种WAL(Write Ahead Log)预写日志思想,是数据库和操作系统中常见的一种手段,用于
1、保证数据操作的原子性和持久性。
2、使得随机写变为顺序写提高性能。
优点:
实时的交易全部是insert账务明细,能大大提高入账速度
缺点:
交易不能实时入账,其实如果控制好定时汇总入账的频度,比如分钟级,用户也是可以接受的,账户减钱透支地风险。
适用场景:
账务更新时效性要求高不高,这种方式对收单类业务(账户加钱)非常实用,但是对支出类业务(账户减钱)类来说,有账户透支地风险。
方案3: 汇总明细记账
既然热点账户瓶颈是余额更新,那我们就降低余额变更频率
,操作方式是把一定时间明细金额汇总,将多次写变为一次写:
balance =balance+ amout1;
balance =balance+ amout2;
...
balance =balance+ amoutN;
优化为
balance =balance+ sum(amout1,amout2,...,amoutN);
优点:
一次性写入账户,减少账户写入更新操作
缺点:
交易不能实时入账,对账户加钱场景很实用,但是账户扣款类场景会出现账户透支问题。
适用场景:
这个方案的适用场景就是不需要实时更新余额,且主要是增加账户余额的场景。如B端收单账户与业务中间账户处理。
其中,批量入账需新增一种修改余额的方式,一次更新余额,批量插入账户流水。
方案4: 缓冲记账(异步削峰记账)
缓冲记账,将入账任务放入到消息队列中异步处理。
优点:
消息队列具有削峰填谷的功能,让突发流量任务让平缓执行,提升系统稳定性,可以准实时记账。
缺点:
非实行性,存在消息堆积以及消息丢失的情况,且存在账户减钱出现账户透支的问题
适用场景:
适用主要是增加账户余额的场景:在B端收单账户与业务中间账户处理;在C端微信、头条等春节抢红包入账处理。但是,高频扣款时需要考虑余额不足的情况,避免账户透支。
方案5: 缓存记账
利用redis缓存的高性能读写优势,和秒杀Redis缓存预扣减库存类似。
优点:
缓存具有高吞吐量、低延迟的特点。
缺点:
缓存宕机,数据会有丢失风险,数据记录可能没有
适用场景:
适合那些对账户金额不特别敏感的场景。比如,小说网站里根据用户观看停留时长给用户送积分,直接操作数据库,会有巨大的访问压。所以,先在redis操作,然后定时一次性flush到数据库。
方案6: 账户拆分
优点:
分散了热点账户写入量
缺点:
当选择子账户扣款的时候,可能出现扣款不成功的情况,但是总的子账户余额是够的情况,这样就会影响这笔扣款交易。
适用场景:
只要能保证子账户资金归集扣减无异常,适用于大部分账户类的扣款入账。
方案7: 读写分离
通过利用不同节点分别承载读取与写入,还可缓解因为锁带来的争用问题,提高单节点的访问效率。
优点:
提高访问性能、稳定性、可用性。
缺点:
同步数据时,可能存在读库和写入不一致情况,可以通过业务上优化避免。
适用场景:
适用于所有场景,准实时性。
方案8: 其他技术优化
8.1. 优化数据库相关配置
连接池优化,CPU、内存优化等等
8.2. 替换读写效率更高的数据
例如:
支付宝-高性能帐务数据库Maxwell:自主可控、超低延时
参考
陈天宇宙-让“热点账户”清凉一夏
laoxilaoxi-交易系统热点账户问题
字节-春节钱包大流量奖励系统入账及展示的设计与实现
百度-交易中台之钱包系统架构浅析
趣头条-万级TPS亿级流水-中台账户系统架构设计