今天,我的美团优选又缺货了---仓储如何保证下单后不缺货

2,518 阅读4分钟

背景:周末在家,用美团优选下单买菜,准备周末在家直接宅两天,周五下单了10多种货品,到了周六去楼下的团长取货时候,发现少了两样,和团长一起找了半个多小时,还是没找到,于是在团长的建议下选择了退货,这不是第一次出现这种情况了,而且团长说这周缺货的特别多。于是我思考了一下问题可能出在哪里,便有了这篇文章。(不是美团员工,有些内容属于猜测)

问题可能出现的点1:系统库存和实际仓储数量不一致。

这个问题的出现使得技术再怎么努力也不能改变的,以为系统存的就是程序员看到的,程序员只能保证自己看到的和操作保持一致,既然实际和系统值不一致,技术上是无法解决的,但是从产品层面应该有些思考的。

因为我是一名后端,只能在产品层面上给一些建议。

1、完善供应链流程,从采购、收货、报损、盘点、校正、出库、调拨等逻辑的完善开始,保证各流程数据的准确性,加强各流程操作人员的规范性。

2、增加盘点的频次,因为美团优选的蔬菜水果区域属于库存高频次更新的区域,因此盘点的频次要提高,可以增加一些给库管增加一些单点盘点的任务,只盘点一些数量可能在今天卖光的产品。

3、还要增加一些临期品自动报废或自动打折的机制,防止因为过期而出现的缺货情况。

问题可能出现的点2:开发出现多卖的情况

这个情况就是开发的问题了,架构师、程序员都是脱不了干系的,我猜想问题可能的原因是:

美团优选在订单提交之前,也就是货物在购物车中时,是没有预扣库存的,也就是说,你放在购物车里的货物是可以被别人买走的,当被别人买走的时候回把我的货物从购物车里删除(这里的用户体验不是很好,我加到购物车里的无缘无故消失了,我自己却不知道),也就是说A货物还剩1件时,甲用户将A加入到购物车,然后继续挑选其他货物,而乙用户购买了A货物(完成了整个交易流程),此时系统会将甲用户的购物车中的A货物删除,这个过程我猜测是通过异步进行的,因为不会因为甲的购物车里有A货物去影响其他人对A货物的购买。也就是这个异步过程可能出现失败、延迟等问题。导致在处理过程中或处理失败后甲购买了A货物,引起的多卖。

这个问题的解决方式很简单,只要在乙用户购买完A物品,A物品出现了卖光的情况,用rides标记下该货物,在其他人进行提交的时候检查是否有rides标记即可。这样的活既可以告知用户购物车中的哪些货物没有货物了又可以防止多卖的情况;

这样处理后新的问题又出现了,上面的问题场景变成了A货物还剩2件时,甲用户将2件A加入到购物车,然后继续挑选其他货物,而乙用户购买了1件A货物(完成了整个交易流程),此时系统不会添加A的标记,因为货物A还有1件库存。此时甲再进行结账还是会出现问题。

那么这个问题就变成了一个秒杀的问题,这里我给出的方案是某货物达到阈值时直接将rides作为主库进行操作,再异步到MySQL中。秒杀的方案设计就不在这里介绍了,这个方案一搜就一大堆。

当然具体美团优选是怎么做的无这边也不是特别清楚,我只是根据在用美团的时候的一些表现猜测,美团是怎么实现的。如果猜测错误,欢迎指正。

问题可能出现的点3:其他用户多拿、错拿

这个问题就很严重,因为它标志着团长这种模式存在漏洞,并且有人在利用这种漏洞。也就是防作弊没有完善。一个产品如果在扩张阶段,可以暂时忽略这个作弊的漏洞,如果达到一定规模了,这种漏洞还存在,就会变成打死这个产品的原因。

首先,这个问题应该从团长教育上出发,从产品设计上给团长一些分货的工具,保证用户体验的同时,减少用户主观的和客观的多拿和错拿的情况。也可以增加一些签收机制保证团长不会作弊的情况。

纯手打,请各位大神留下些意见。