什么是热点账户
指高并发更新余额的账户。
如果一个账户短时间内有大量的出入金请求,反应在DB层就是对某一行数据的大量update操作。
大家都知道DB加锁释放锁的代价很高,就会导致大量的update sql积压在DB,最终拖垮整个数据实例,导致DB宕机。
对比库存系统设计
这种场景类似于电商的库存系统设计,但是支付的账户安全等级远比库存系统级别要高,需要计算每次请求后的剩余余额且不能透支。
故电商库存系统通过幂等表+数据库乐观锁更新
的方案不能适用。
由于redis缓存并不是高可用的存储故在金融系统一般不使用Redis做金额计算。所以对于redis + DB顺序写
的热点库存解决也不适用。
常见解决方案
-
异步入金 同步出金,即针对增加余额操作进行异步缓冲记账,对于扣减余额同步记账防止透支
-
拆分子账户,将BD更新打散到多行分别更新,但是存在子账户合并扣减余额问题,方案较为复杂
-
开启DB热点行更新功能,在DB层面进行update操作的聚合更新操作。此类DB的开发维护对于公司层面成本较高
落地方案
采用异步入金 同步出金
的方案实现成本最低,故为大多数选择且已落地。
设想方案
缓冲记账方案存在出金热点问题。
针对此问题可以使用redis进行防透支 + 异步入金
的方案。
由于引入了Redis导致存在DB与缓存的数据一致性问题,需要引入监控和订正的定时任务,方案存在一定复杂性。
当然Redis方案也可以简化,去除Redis,即在余额充足的情况下,直接异步。不足时降级成同步出金。
综上讨论,是不是可以做成 双异步缓冲记账
。
即入金缓冲记账对交易直接返回成功,出金也缓冲记账,但是对交易返回处理中,缓冲记账完成后回调给交易最终结果。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: