扣库存方案
下单减库存?
- 并发请求
- 创建订单(恶意下单&不会超卖)
- 扣库存
- 支付
支付减库存?
- 并发请求
- 创建订单(订单超卖)
- 支付 (订单支付不了)
- 扣库存
预扣库存?
- 并发请求
- 扣库存
- 创建订单
- 支付(不支付库存卖不出去)
先扣库存然后创建订单、支付
10分钟不支付则取消订单,避免不支付库存卖不出去问题
极高并发下单服务极致性能
减少上下文切换
较少阻塞式I/O
I/O主要包括
- rpc调用
- 磁盘读写
无I/O
- 拆解-扣库存与写订单分开
- 用内存
- 用本地内存
单服务
多服务
- 初始化库存到本地库存
- 本地减库存,成功则进行统一减库存,失败则返回
- 统一减库存成功则写入MQ,异步创建订单
- 告知用户抢购成功
创建、支付订单
- 与扣库存服务隔离
- 用户收到抢购成功、页面跳转到订单中心去支付
读商品信息页面
- 与库存服务隔离
- 商品库一主多从提高读能力
- 页面静态化+缓存+db实现即可
排队进度查看
- 数组A储存排队中,待创建订单的用户;数组B用作索引,存储uid对应在数组A中的索引位置
- 每次从数组A中依次消费数据,并记录最近消费的索引值X
- 用户来查排队进度时,从hash表B中取出该uid对应存储的索引值Y;
- 索引值Y-索引值X=排队进度值
高性能读库存
无I/O
- 读取本地库存,无则主动拉去一次,有则返回
- 异步脚本定时同步库存至本地
版权声明:本文为weixin_42260789原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。