热点账户解决思路

987 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

热点账户解决思路

前言

什么是热点,这个热点是指大部分流量落到一个单点上,这个单点可以是某台机器,某个网卡,某个服务,某个数据库,甚至是数据库上某行记录。

单点问题会制约性能。比如账户如果为数据库一条记录,频繁更新的话,数据库 TPS 很可能上不去。

什么是热点账户

一次动账操作,包括记录流水,对账户&余额进行校验, 更新账户余额,更新账户日余额(每天动账金额&笔数信息),更新累计金额(校验账户日限额或者总限额)。

可以看到一次动账操作,保护很多次 SQL 操作,要保证数据一致性,一般放在一个事务中进行处理。防止账户并发问题, 需要对该条账户加锁。

多次SQL 操作,对数据库性能有很大影响, 一条 SQL 5ms,10 条 就是50ms ,QPS 是上不去的。

账务操作,对性能,和资金安全要求都很高,有什么方案可以解决这些问题呢?

汇总记账

汇总记账,就是说动账时先不实时更新账户余额,先落下记账流水,然后启动一个定时任务,捞取一批流水,进行汇总,再一次性更新余额,这样的方式,减少了很多次账户操作,避免数据库行锁竞争带来的性能问题。

拆分子账户

热点账户拆分,单个热点账户性能不够,那么就对热点账户进行拆分,拆分成多个子账户。 将一个大账户的余额均匀分布到不同子账户中。 动账操作在不同的子账户上进行。

有什么问题?

  • 由于余额进行了拆分,就可能,出金的时候,单个账户余额不够用,但是其他子账户还有钱,其实是够用的,就会出现拒绝动账的情况,怎么办? 对子账户进行合并余额,端时间内

  • 连续账单问题,同一个商家的动账明细分布在不同的子账户上,会导致动账明细不连续。每条动账明细期初期末余额对不上,这样不行。

适用场景

由于无法判断金额是否够用,就会出现出金扣余额成负数这个情况,但是其实是不可接受的,因此,这宗拆分子账户适合 绝大部分是入金的场景