商城系统库存问题分析
电商的库存设计,是后台的重点,也是难点,关乎商品是否存在超卖。商品的库存增加方式倒不难,直接在后台添加即可,而扣减方式就尤为重要,用户在前端提交订单减库存,还是在支付成功后减库存,两种方案各有利弊,对后台库存数据的变化影响也很大。
这里且先不说两种方案的利弊,先看看淘宝是如何做的,淘宝是将两种方案都做了,给卖家选择。
12306是怎么做的呢,小编大胆的猜想,是支付成功后,减的库存,而且一定是。
下面来分析下两种方案的利弊:
第一种,提交订单的时候减库存:加入A商品库存数为100,采用下单后,减库存的方案,常规商品系统,下单归下单,支付归支付,是区分开的,例如在10分钟内,有99个人下单了并且支付,身下一个订单,同一个时间,有两个人同时下单,比如都是2019.10.10 12:32:12 这个时间点,由于系统在这个时间点判断都还有一个库存,所以他们两个都完成了下单操作,此时库存为商品库存为0,但是实际上是101个人下了单,而且这101个人都可以支付成功,这时候就出现了超卖现象。
出现这种情况的场景有两个:一个是商品火爆,短时间内被下单,还有一个是商品库存量小。
优点:实时减库存,避免付款时应库存不足,减库存问题
弊端:存在说在短时间内,很多人都下单了,但是没有支付,一直锁定着库存数据。真正的买家买不到
第二种,在支付成功的时候减库存:案例同第一种方案中的案例,也是存在同样的问题,在同一个时间点:比如都是2019.10.10 12:32:12 这个时间点,100件库存,有101人同时支付,产品依然存在超卖现象
优点:防止有人恶意下单,占用库存
弊端:在并发量很高的情况下,依然会存在超卖现象。买家认为已经下单了,但是告知不能付款
这就解释了为什么小编猜想12306一定是采用支付成功后,减库存问题,由于用户买车票的人太多,经常出现剩下的票数很少,很多人抢票的问题,如果是下单,没减库存,车票会被占用,想买的人买不到。另外也解释了为什么在12306网站上看到还剩余一张车票,支付的时候,告知没有车票的问题。就是剩下一张票,被多人下单,而实际只有一人能支付成功。
解决方案
关于超卖问题,根本上是不可解决的,(目前为止,小编了解到),但是可以通过一些优化方案,将风险降低
方案一:限制用户下单数量:小编经常在某宝上看到,该商品限购五件,其实并不是限购五件,而是该商家采用下单减库存,为了防止有人恶意下单,所以采用了限制用户下单数量解决该问题。实际上你想买多少件,都会有的
方案二:对恶意下单的做标识:这种方法相当于黑名单,该用户出现恶意下单,标记,被标记后有一定的约束条件,这是后话
方案三:后台库存预警:后台库存预警,是一种很好很有效的方法,一方面,提示该商品快没有货了,让卖方跟进,另一方面,如果是有人恶意下单,可以采取一定的措施去处理
方案四:备用库存:备用库存,即同一个商品提供了两个库存,这是网上看到的一种方案,小编觉得并没有将问题改善、但是从设计人员,开发人员的角度去考虑。不失一种良策。
关于秒杀活动对库存问题的分析
上文提到,商品库存是下单还是支付环节扣减库存,均是考虑并发的问题,而秒杀活动更是短时间内的并发,秒杀具有时效性,短则一秒,长则不过数十小时。
既然秒杀的商品有时效性,其实是对库存更好的控制,时间未开始,和时间已结束,则不能下单支付,在活动时间内才可以进行支付,而且要采用下单成功,减库存,为什么呢,假设活动只有一秒,如何让用户在短短一秒的时间完成下单并支付,明显是做不到的,同样的如果活动时间是1小时,在这一小时内,有人下单,可以设定在多短的时间内要支付,否则系统要对订单自动关闭,即释放库存,这样可以让别的买家在进行购买。
这里有人提出一个问题,例如活动是一小时,而下单后,假如是5分钟内要支付,那么会出现说在活动时间的最后两分钟,有人下单了,实际并没有支付,导致该库存被锁定,实际又没有完成支付。是的,确实是存在该问题,无论采用支付后减库存还是下单后减库存,不能百分百的解决该问题,只是将风险,问题降低。更好的服务于用户。因为,前文已经说了,本质的问题其实还是存在。
以上分析库存问题仅仅是一个库存,在一个商户上进行交易,实际场景要比这复杂的多,例如我是一家连锁店:A商品,总库存是10000件,在某宝上有多家商店,存在库存调度,共用一个库存的问题,库存调度,分配,设计方式有很多种,例如方案一:可以采用一个总库存,分库存的方案,总分结构,对库存进行调度,方案二:可以采用各个库存是独立的,数据调度,,方案三可以采用层级机构,有一级,二级,三级这种多层级结构去设计库存管理。这要根据实际情况去分析该问题。
感谢看官的阅读,如果有错欢迎指正。下一篇计划讲解:单点登录设计模式