作者 : 杨考 微信号 : devin_cn_hd_09_16
本文是【讲解篇】和【技术分享篇】结合起来,由于CSDN文章图片丢失,又补了一次图片。同时进行了章节拆分。
全量版 https://blog.csdn.net/yk200808/article/details/80755459
第一节:业务简介 https://blog.csdn.net/yk200808/article/details/81624677
第二节:业务分析 https://blog.csdn.net/yk200808/article/details/81624779
第三节:功能设计 https://blog.csdn.net/yk200808/article/details/81624826
第四节:热点问题 https://blog.csdn.net/yk200808/article/details/81624861
第五节:准确性 https://blog.csdn.net/yk200808/article/details/81624899
第六节:使用建议 https://blog.csdn.net/yk200808/article/details/81624917
第七节:思考总结 https://blog.csdn.net/yk200808/article/details/81624934
如下是几大热点问题:每个问题的具体处理方案在后面有详述。
简要解析:同步和异步并存,是一个综合方案,可以保证账务处理的实时性,如下方案的优、缺点以及引发的问题,在下图有详述。
热点账户就是在交易过程中,出现频次特别高的账户,交易频次指的是某个时间段的交易频次一直保持在比较高的次数。
如果是数据操作错误重试导致某账户瞬时出现高频操作,则不属于热点账户范畴。
1) 账户每秒有10次以上更新需求
2) 串行化时账户处理延迟高于1秒以上
热点账户类型 |
账户属性 |
实时需求 |
锁需求 |
处理方式 |
性能 |
业务大账户 |
内部账户 |
无实时余额查询 无实时提现 |
无需加锁 |
异步 |
满足 |
大代理商账户
|
对外账户 |
无实时余额查询 无实时提现 |
没有加锁需求 |
异步 |
满足 |
热门商户(推广) |
对外账户 商户账户 |
实时余额查询 实时提现 |
有加锁需求 |
串行化同步 |
亟待提升 |
1) 在异步化背景(账户实时处理的上游,如果已经存在了异步化的处理)下,此时业务所需要的下游的实时性是不可能完全实时的
2) 对于热点账户而言,问题在于一条数据表项的更新频次已经达到了上线,所以解决热点账户的方案可以从解决数据读取的瓶颈出发。
4.5.2.1 完全实时设计实现
业务直接调用账务系统交易的API接口,实时处理账务交易,所谓的实时交易,也是进行了一定的优化(同步和异步相结合)。
1) 商户账户扣费,使用的是实时扣费
a)账户更新使用redis锁代替数据库锁,同样也是悲观锁,不过请求不阻塞,请求延迟很小
b ) 请求锁失败,业务继续重试请求。
c ) 平台内部账户仍然采用异步余额更新,减少了分账的锁阻塞几率,有效保证了同步更新的成功率,即减少了锁请求失败的概率。
2) 百度外卖推广收入账户,同样采用的是异步更新账户金额的方式。因为这个账户是平台共用,属于热点账户,锁阻塞很严重,但是该账户的任何行为和表现不会影响到商户账户余额更新,所以这里使用异步更新的方式,消除了热点账户的影响。
4.5.2.2 完全实时场景
CPC(按点击扣费)业务,账户提现等
各业务的资金分账,入消息队列,调用账务交易平台资金操作接口,账务平台按分账需求和分账状态处理账务消息
通过消息队列处理账务交易信息,QPS基本不是瓶颈
通过对业务和订单散列细分,账务交易系统可以有序、快速处理资金,
支持批量请求,从业务层解除数据依赖和状态依赖
最终测试结果:账户余额更新最差延迟时间控制在15秒内。
用户订单,物流订单等账务处理都是非实时需求场景