秒杀系统中【下单】、【减库存】、【支付】之间的关系

秒杀系统中【下单】、【减库存】、【支付】之间的关系


订单系统中如何扣除库存?

在订单系统中,有限状态机通常包括【生成订单】、【减扣库存】、【用户支付】这3个基本状态,这3个阶段的顺序如何安排才合理呢?

1.下单后减库存

在用户生成订单后,减扣库存,然后等待用户支付

优点:不会超卖

原子操作,不会发生超卖的情况

超卖:订单 > 库存

缺点:I/O、少卖

  1. 生成订单是需要操作DB的,在秒杀的情况下,这部分耗时十分影响体验

    解决措施:预扣库存

  2. 用户可能存在恶意下单的行为,只下单不支付,导致少卖

    解决措施:订单需要在指定时间内完成支付,否则视为放弃


2.支付后减库存:【超卖】

在用户完成支付后,才去扣减库存

缺点:超卖、I/O

  1. 同样的,生成订单是需要操作DB的,在秒杀的情况下,这部分耗时十分影响体验

    解决措施:预扣库存

  2. 在高并发情况下,用户可能会创建很多订单,当库存减为零的时候很多用户发现抢到的订单支付不了了,这也就是所谓的“超卖”,是非常影响用户体验的

    这个问题没有解决措施,所以先支付后减库存是不合理的!


3.预扣库存:MQ异步创建订单

只要创建订单,就需要操作DB,怎么做到秒杀过程中不操作DB呢?
答案是:Redis中预扣库存,通过MQ异步创建订单,并且要求用户在指定时间内完成订单的支付


扣减库存一定要发生在支付之前

扣减库存一定要发生在支付之前,否则后果就是“超卖”

  1. 下单 -> 扣减库存 -> 支付:少卖、下单I/O耗时
  2. 预扣库存 -> 异步下单 -> 支付:最优解
-------------本文结束感谢您的阅读-------------

本文标题:秒杀系统中【下单】、【减库存】、【支付】之间的关系

文章作者:DragonBaby308

发布时间:2019年11月27日 - 22:49

最后更新:2020年01月03日 - 23:02

原始链接:http://www.dragonbaby308.com/seckill/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%