随着移动支付的越来越便捷,如何保证账户余额正确性变成了难题。尤其针对没有支付系统开发经验的程序员,如下咱们解读一下此类问题(拿支付宝举例):
支付宝需要有个账户记账,现在很多第三方公司使用支付宝作为结账业务主要手段,故出现了很多热点账户。比如互联网大商家,打车业务,快的,滴滴等。账号有余额,大并发交易下余额快速变化,需要保证账户余额正确性。
需求如下:
1.账户减款
2.账户加款
3.读取总即时金额
设计方案:
最简单设计: 帐户表+流水表. 每次帐户加减款都需要增加流水,和帐户变动.
业务需求: 高并发帐户.
技术选择 1. 悲观锁(高并发帐户), 乐观锁(普通并发帐户). 3. 顺序化,把同步转异步,使用mq 降低峰值.
存储选择: redis或者数据库. redis本身并发能力就是比数据库要好. 但是单机支持的数据量不如数据库大. 只存放account的值的话到还好.根据场景自己作区分。
账户转账分两个接口,一个可扣成负数,一个不能扣成负数.
1 如何消除余额竞争呢?
方案一:变成两个账户 模仿 担保交易,设置两个账户 1. 扣款账户 2. 加款账户
1.1. 商家都是频繁加款 ,加款账户只记流水,不计算余额. 避免频繁竞争
1.2. 加款帐户的流水定时汇总到扣款帐户上.
1.3 扣款账户用于退款和提现, 因为频率不高. 即保证余额控制,也没有并发问题. 退款有些业务能扣成负数,有些业务不能.
缺点: 进入的钱不一定能时时能用. (对小商家不适用,比较计较)
优点: 这样就避免了热点账户的余额计算。