三户模型
客户(自然人 法人) 用户 账户(虚拟账户)
对账户的余额操作权
热点账户 资金发生的方向
加频账户(入金) 减频账户(出金) 双频账户(入金转账)
缓存限流降级
限流: 超出我能力范围的我不处理,拒绝部分请求,压测后的兜底方案
缓冲: 同步转异步 大量的积压 循环积压
批量汇总:汇总明细一次性提交更新余额的方式来减少更新余额的频次,汇总提交,适合加频账户,账户余额更新不够及时
分治:类似于秒杀,参考库存热点的方式做库存拆分,分治,影子账户路由,如何平衡各个影子账户的资金,如果某个影子账户的余额不足
需要扣对个影子账户要怎么处理,流水中金额前后的变动无法体现
缓存:
我们可以将账户的余额同步一部分到缓存中,当请求过来后,先对缓存的余额进行操作,让缓存阻挡住对数据库余额的频繁操作
后续可以在交易的低峰期进行对账操作,防止缓存故障导致的数据库一致性问题,一般只针对于减频账户
• 加频账户处理:准实时更新余额。先将金额变动插入临时表中,由定时任务按照一定频率汇总发生额,并更新账户余额,而后删除临时记录。当加频账户减钱余额不足时,主动去汇总发生额。这里需要考虑主动汇总发生额和定时任务处理的并发情况,我们在该定时任务执行时设置redis锁,防止并发,主动汇总时会去判断这个redis锁是否存在,如存在证明定时任务正在执行,无需主动汇总,可能是真的余额不足。主动汇总同样会设置redis锁,定时任务同样会判断。
• 减频账户处理:将减频账户拆分多个子账户,减频子账户设置金额报警,如果某个减频子账户余额不足触发报警,会对该子账户做资金归集,将其他子账户余额归集到该子账户(每个子账户设置可归集金额限制)。如在交易过程中发现该子账户余额不足,转向使用其他子账户记账。由于拆分子账户,余额查询时需要汇总各个子账户余额返回;记录主账户流水需要记账后余额,这里需要异步计算汇总。当减频账户加钱时,需要平均分配入账到不通的子账户。
• 双频账户处理:将双频账户拆分多个子账户。加钱时,准实时更新余额,先将子账户金额变动插入临时表中,由定时任务按一定频率汇总发生额,将汇总的发生额更新进对应的子账户,并删除金额变动记录;减钱按照之前减频账户的逻辑执行。
- 记账死锁问题
高并发情况下,当多个账户之前互相转账时,可能会出现死锁问题。
例如:A余额账户 —> B余额账户(线程1)
B余额账户—>A余额账户(线程2)
两个转账请求并发,账户系统对每个转账请求都会更新A、B余额,这两个更新需要在一个事务里,正常流程线程1先更新A,再更新B,线程2先更新B,再更新A,线程1更新完A后会等待B的锁,不提交事务,线程2更新完B后会等待A的锁,不提交事务,这样两个线程互相等待锁,造成死锁。
宜信支付结算账户系统针对这种情况提出了解决办法,对账户号进行排序后再更新余额,这样每个线程都是先更新A再更新B,解决了死锁问题。
网友评论