在【精通高并发系列】的文章《实践出真知:全网最强秒杀系统架构解密!》中,冰河详细讲解了高并发闪购系统的架构设计,并简单提到了如何扣减商品的库存。可能很多朋友会问:扣除产品的库存很简单。用户下单时扣除相应的产品库存不就可以了吗?有那么难吗?确实,从理论上讲,用户下单后,商品就会被扣除。清点完毕。但是,如果你的系统流量大,并发度高,比如淘宝的双十一,一个火爆的产品参加活动,库存只有1000件,几十万用户抢购,产品售完1,000件。不多也不少。你还觉得简单吗?不做就会“超卖”,后果很严重。今天,我们就来简单探讨下,如何在高并发闪购系统中正确扣除商品的库存。库存的抵扣方式为了方便大家理解,我们先来探讨一下库存的抵扣方式。一般来说,存货的抵扣可以分为三种:订单抵扣存货、付款抵扣存货和存货抵扣。下单减库存先说说下单减库存的方法。这种方式很容易理解,就是在用户提交订单后,从用户购买的商品数量中减去商品的总库存量。这种减少库存的方式是最简单、最准确的商品库存控制。但是,经常遇到的问题是,用户提交订单后,可能无法付款。会出现一个问题:恶意刷机。试想一下,作为商家的你,参加了淘宝的双11秒杀。如果淘宝平台通过下单减库存的方式扣库存,你的竞争对手就会知道你参加了双十一闪电杀,就会恶意下单。这样你就可以把你参与秒杀的所有商品都下单,这样你的库存就会降为0,但是他们不会付款。那么你参与双11闪购的商品是无法正常销售的。此时你的心情是怎样的?这就是下订单和减少库存的问题。货款减库存既然下单减库存有问题,我们再来看货款减库存。库存减去库存是指用户提交订单后,不会立即减去商品的库存。而是直到用户实际付款后才会扣除库存。这种方式经常遇到的问题是:用户明明下单成功,却无法支付。原因是用户下单时不会扣除库存,而是在实际付款后扣除库存。当用户下单并执行支付操作时,对应的商品可能已经被其他人购买了。少付库存的另一个更严重的后果可能是:超卖库存。**这主要是因为用户提交订单时不会扣除库存,导致用户下单成功的数量可能远远大于商品的库存。存货预扣存货预扣比前两种存货扣扣方法相对复杂。用户提交订单后,为用户保留购买数量的库存,例如10分钟。10分钟后,为该用户保留的库存将被释放,其他用户可以继续下单。用户下单预扣库存后,支付时,系统会检查对应订单是否有有效预扣库存,若存在则扣除实际库存并进行支付。如果不存在,则再次尝试扣留存货。如果库存不足,将不再付款。如果扣存成功,则进行实际扣存和货款。那么,存货预抵能否解决存货抵扣的前两个问题呢?答案是还没有完全解决。例如,对于恶意订单,虽然有效支付时间被控制在短时间内,但恶意用户完全有可能在一段时间后再次下单。也有可能在您开始下单的时候,会选择所有的存货一次性下单。还是不能彻底解决问题。那么有什么办法可以解决这些问题呢?我们继续往下看。库存扣款问题的解决方案针对恶意用户下单的情况,我简单罗列以下解决方案:(1)我们可以给经常下单不付款的用户添加相应的标签。这些用户下单时,要进行特殊处理,如不扣库存等(具体可根据需求确定)。(2)秒杀期间,设置同一人对该商品的最大购买件数,例如最多可购买2件。(三)限制重复下单不付款的操作。例如下单同一商品时,先检查当前用户是否有未付款的订单,订单中的商品与再次下单的商品是同一商品,则提示用户先付款再提交订单,等。针对库存超卖的情况,我简单列举以下解决办法:(1)通过补货的方式解决。(2)用户下单时,提示库存不足。秒杀系统如何扣除库存?可能很多朋友会说,高并发秒杀系统会用到预扣库存的方式。库存方式。在下单扣库存的业务场景中,需要保证大流量、高并发的商品库存不能为负数。这里,我们可以通过以下解决方案来解决商品库存不能为负的问题。(1)扣除库存后,判断应用程序交易中商品库存是否为负数。如果它变为负数,则事务将不会回滚。然后扣除存货。(2)将数据库中的inventory字段设置为无符号整数,从数据库层面保证不能出现负数。说了这么多,原来在高并发、高流量的秒杀系统中,要实现商品库存的正确扣减,真的不是一件容易的事!
