热点账户

上周之前组里的同学问了一个热点账户的问题。当时,回答的比较简单,后来想想这是个好问题,就又总结了一下。

解决账户的问题,既要避免资损,又要提高效率,还要必须支持高并发。所以,简单来说,可以在入金时缓冲入账,收到请求就返回成功;在出金时、拆分子账户、将热点分散、支持高并发。

其实、在面视中,这也是个好题目、即有技术也有业务、还可以问到一些具体的技术。解决的方案简单来说,还是上面的那句话。但细节还是很多,所以顺便做一次梳理记录。

1、什么是热点账户?简单说,就是高频进行加减的账户。举个例子,在理财的场景中到期兑付(不是用户行为的主动赎回、如果是用户行为,还可以预先在前端做一波限流,可参照秒杀),发生兑付的账户就是热点账户。如果兑付时,交易不做限制,高并发的调用账务、从兑付的商户扣钱、给用户的账户加钱。就会产生热点账户。当然可以从交易层面做限制,但讨论的是热点账户还是从账户层面找解决方案。

2、例如:兑付对公司来说是出金业务
借:个人余额
贷:商户(支付账户)余额
当发生批量兑付时,商户的几户就是热点账户,频繁的减少余额。因为记账时,所有涉及账户余额都要update更新,在高并发的情况下,当出现上述类型的热点账词的时是,由于数据库的行级锁、对同一账户的更新余额操作由并行变成串行,单个请求响应时间变长,从而拖垮整个记账服务。

3、根据账户变动的方向 ,可以有不同的处理方式:

a.入金:缓冲入账
例如:话费充值、走的就是科技代结算、先将客户水电煤的费用,代收到捷银商户,当话费充值出现并发,不过一般不太可能,除非有营销活动。只是举个例子,这里的捷银在高并发的情况下就是热点账户。
在公司发生的比较多的还是出金账户的高并发,入金的高并发,应当只有之前替陆金所、寿险做的代收付业务,但因为是批交易,其实也可以从业务系统,对交易做限流,而不用账户承担风险。
借:商户余额+
贷:个人余额-
也就是准实时的入账、所有的实时交易全部insert临时表(insert的开销很小,能够支持高并发。如果基于分布式部署、insert的并发量理论上可以无限大)由定时任务按照一定的频率汇总发生额、并更新账户余额。以及当账户减钱发生余额不足时,也需要主动去汇总发生额。这里还有主动汇总发生额和定时任务任务处理的并发情况。这里的并发可以使用redis分布锁。具体细节还有很多,但总的来说,就是因为是入金,可以入库成功,即返回交易系统,记账完成。但这个不适用于出金,出金在减钱、一个是对公司而言,出金更要严格控制、缓存入账余额为负不好控制。

b、出金:拆分子账户

拆分子账户,出入金都合适。就是将账户拆分为多个子账户,每个子账户设置金额报警,如果某个子账户余额不足触发报警,就会对该子账户做资金归集,将其他子账户余额归集到该子账户,每个子账户设置可归集金额限制,如在交易过程中发现子账户余额不足,转向使用其他子账户记账。由于拆分子账户、查询时需要汇总子账户,还需要异步汇总主账户。以及当账户加钱时,需平均分配到不同子账户。设计的思想大致这样,细节还有很多地方需要注意,不然容易有资损

4.所以可以根据账户的使用方向,设置使用哪种方式。比如代收业务,就可以使用缓冲入账、兑付,可以使用子账户。代收付就只能使用拆分子账户。

5.除了写操作,账户的查询也是个问题 。比如账户流水表,既要按账户维度查询,又要按时间维度汇总。所以针对这个特点、可以冗余一张表、一张按照账户分表、一张按照日期分表。
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值