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

前言

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

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亿级流水-中台账户系统架构设计

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容