支付系统热点账户设计

/ 支付

什么是热点账户

指高并发更新余额的账户。

如果一个账户短时间内有大量的出入金请求,反应在DB层就是对某一行数据的大量update操作。

大家都知道DB加锁释放锁的代价很高,就会导致大量的update sql积压在DB,最终拖垮整个数据实例,导致DB宕机。

热点账户-热点账户问题

对比库存系统设计

这种场景类似于电商的库存系统设计,但是支付的账户安全等级远比库存系统级别要高,需要计算每次请求后的剩余余额且不能透支。

故电商库存系统通过幂等表+数据库乐观锁更新的方案不能适用。

由于redis缓存并不是高可用的存储故在金融系统一般不使用Redis做金额计算。所以对于redis + DB顺序写的热点库存解决也不适用。

常见解决方案

热点账户-异步入金 同步出金

落地方案

采用异步入金 同步出金的方案实现成本最低,故为大多数选择且已落地。

热点账户-缓冲记账流程

设想方案

缓冲记账方案存在出金热点问题。

针对此问题可以使用redis进行防透支 + 异步入金的方案。

由于引入了Redis导致存在DB与缓存的数据一致性问题,需要引入监控和订正的定时任务,方案存在一定复杂性。

当然Redis方案也可以简化,去除Redis,即在余额充足的情况下,直接异步。不足时降级成同步出金。

综上讨论,是不是可以做成 双异步缓冲记账

入金缓冲记账对交易直接返回成功,出金也缓冲记账,但是对交易返回处理中,缓冲记账完成后回调给交易最终结果

热点账户-双队列缓冲