美文网首页
架构师方案-热点账户处理

架构师方案-热点账户处理

作者: 香沙小熊 | 来源:发表于2023-12-09 18:14 被阅读0次

    前言

    热点账户广泛存在于大商户或明星用户的出入账、营销等场景,是行业普遍存在的技术问题。

    image.png

    账户系统最重要、最基础的系统工作是记账,记账的准确性、及时性和吞吐直接影响着用户的业务体验和资金安全。

    一般账务系统对账户的冲扣需要满足以下3点:

    1、更新账户表中的账户余额。

    2、记录账户明细表中的账户更新前余额,账户更新后余额,操作金额。

    3、关联记录单据凭证(引起账户变更的业务因子)方便对账

    其中对账户表中的余额更新一般是直接update操作,在高并发下为了保证账户资金安全,我们一般会加锁处理,但这就会影响账户的实时处理。基于此,本章整理业界常用方案,给大家提供解决思路。

    方案1:限流控制

    既然系统支持不了那么多账户扣减的人,直接把能承载系统之外的请求,拒绝掉。

    image.png

    优点:
    实现简单,添加限流器。

    缺点:
    这个是牺牲用户体验来保障系统性能,支付或者账务处理的失败率会提升。
    适用场景:
    这种方法可以作为兜底方案,配合其他方案使用,保护数据库和系统的安全的措施是不能缺失的。

    方案2:预写日志记账(WAL方式)

    在表中插入新数据时,INSERT命令的效率通常比UPDATE要高,因为更新时需要进行大量的数据读取和写回操作,而INSERT命令只涉及到简单的顺序写入操作。

    image.png

    既然账户更新是在数据底层是一个随机操作,那就把先用写入速度更快的插入log操作,然后定时将这些log变为实际更新。
    这其实是一种WAL(Write Ahead Log)预写日志思想,是数据库和操作系统中常见的一种手段,用于
    1、保证数据操作的原子性和持久性。
    2、使得随机写变为顺序写提高性能。

    优点:
    实时的交易全部是insert账务明细,能大大提高入账速度

    缺点:
    交易不能实时入账,其实如果控制好定时汇总入账的频度,比如分钟级,用户也是可以接受的,账户减钱透支地风险。

    适用场景:
    账务更新时效性要求高不高,这种方式对收单类业务(账户加钱)非常实用,但是对支出类业务(账户减钱)类来说,有账户透支地风险。

    方案3: 汇总明细记账

    image.png

    既然热点账户瓶颈是余额更新,那我们就降低余额变更频率,操作方式是把一定时间明细金额汇总,将多次写变为一次写:

    balance =balance+ amout1;
    balance =balance+ amout2;
    ...
    balance =balance+ amoutN;
    优化为
    balance =balance+ sum(amout1,amout2,...,amoutN);
    

    优点:
    一次性写入账户,减少账户写入更新操作

    缺点:
    交易不能实时入账,对账户加钱场景很实用,但是账户扣款类场景会出现账户透支问题。

    适用场景:
    这个方案的适用场景就是不需要实时更新余额,且主要是增加账户余额的场景。如B端收单账户与业务中间账户处理。

    其中,批量入账需新增一种修改余额的方式,一次更新余额,批量插入账户流水。

    方案4: 缓冲记账(异步削峰记账)

    缓冲记账,将入账任务放入到消息队列中异步处理。


    image.png

    优点:
    消息队列具有削峰填谷的功能,让突发流量任务让平缓执行,提升系统稳定性,可以准实时记账。

    缺点:
    非实行性,存在消息堆积以及消息丢失的情况,且存在账户减钱出现账户透支的问题

    适用场景:
    适用主要是增加账户余额的场景:在B端收单账户与业务中间账户处理;在C端微信、头条等春节抢红包入账处理。但是,高频扣款时需要考虑余额不足的情况,避免账户透支。

    方案5: 缓存记账

    利用redis缓存的高性能读写优势,和秒杀Redis缓存预扣减库存类似。

    image.png

    优点:
    缓存具有高吞吐量、低延迟的特点。

    缺点:
    缓存宕机,数据会有丢失风险,数据记录可能没有

    适用场景:
    适合那些对账户金额不特别敏感的场景。比如,小说网站里根据用户观看停留时长给用户送积分,直接操作数据库,会有巨大的访问压。所以,先在redis操作,然后定时一次性flush到数据库。

    方案6: 账户拆分

    image.png

    优点:
    分散了热点账户写入量

    缺点:
    当选择子账户扣款的时候,可能出现扣款不成功的情况,但是总的子账户余额是够的情况,这样就会影响这笔扣款交易。

    适用场景:
    只要能保证子账户资金归集扣减无异常,适用于大部分账户类的扣款入账。

    方案7: 读写分离

    通过利用不同节点分别承载读取与写入,还可缓解因为锁带来的争用问题,提高单节点的访问效率。


    image.png

    优点:
    提高访问性能、稳定性、可用性。

    缺点:
    同步数据时,可能存在读库和写入不一致情况,可以通过业务上优化避免。

    适用场景:
    适用于所有场景,准实时性。

    方案8: 其他技术优化

    8.1. 优化数据库相关配置

    连接池优化,CPU、内存优化等等

    8.2. 替换读写效率更高的数据

    例如:
    支付宝-高性能帐务数据库Maxwell:自主可控、超低延时

    参考

    陈天宇宙-让“热点账户”清凉一夏
    laoxilaoxi-交易系统热点账户问题
    字节-春节钱包大流量奖励系统入账及展示的设计与实现
    百度-交易中台之钱包系统架构浅析
    趣头条-万级TPS亿级流水-中台账户系统架构设计

    相关文章

      网友评论

          本文标题:架构师方案-热点账户处理

          本文链接:https://www.haomeiwen.com/subject/tequgdtx.html