微服务 —— 订单与库存设计|8月更文挑战

1,292 阅读5分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

1 订单单号

订单单号是订单信息中的主Key,代表了该订单的唯一性,并且使用在仓库管理系统中,WMS作为拆分合并订单中与电子商城中的订单关联的Key值。订单单号一般组成方式有以下两种:

  • 日期时间+随机数字

    • 初期业务量不多的时候20-26位足够应付
    • yyyyMMddHHmmss(年月日时分秒) + 6位随机码
    • 6位随机码表示一秒钟可能生成的订单数上,存在一百万分之一的随机并发相同导致下单失败,因此在初期业务每秒下单量不高的时候选择这种简单的方法足够满足需求
  • 日期时间+自增

    • 不会产生随机数生成冲突
    • 注意防治被查看到销售量需要将数字加密设置

2 倒计时时间

订单里面显示倒计时有:

  • 下单未支付

    • 商品下单后开始倒计时,一定时间内如果还未下单则超时关闭订单
    • 普通商品一般采取3天时间,特价商品根据情况一般采取的是30分钟,快消品一般采用的15分钟
  • 已发货确认收货倒计时

    商品一般是发货开始后开始倒计时10天时间,O2O商品应该是送达即收货。

    • 满1天记录1天 XX天hh小时mm分钟
    • 小于1天小时则hh小时mm分钟ss秒

    防止发货时间过长,发货后用户可以采用一次延长收货,商家/平台端则可以多次延长收货

3 扣减库存

用户下单后,系统需要生成订单,此时需要先获取下单中涉及的商品信息,然后获取该商品所涉及到的优惠信息,如果商品不参与优惠信息,则无此环节。扣减库存规则是指订单中的商品,何时从仓储系统中对相应商品库存进行扣除。方式各有优缺点,需结合实际场景进行考虑,如:秒杀、抢购、促销活动等,可使用下单减库存的方式。而对于产品库存量大,并发流量没有那么强的产品使用付款减库存的方式。

秒杀场景下如何扣减库存?

  • 采用下单减库存

    因秒杀场景下,大部分用户都是想直接购买商品的,可以直接用下单减库存。大量用户和恶意用户都是同时进行的,区别是正常用户会直接购买商品,恶意用户虽然在竞争抢购的名额,但是获取到的资格和普通用户一样,所以下单减库存在秒杀场景下,恶意用户下单并不能造成之前说的缺点。而且下单直接扣减库存,这个方案更简单,在第一步就扣减库存了。

  • Redis 缓存

    查询缓存要比查询数据库快,所以将库存数放在缓存中,直接在缓存中扣减库存。如果并发很高,还可以采取分布式锁的方案。

  • 限流

    秒杀场景中,对请求做了很多限流操作,如前端页面的限流和后端令牌桶限流,真正到扣减库存时,请求数很少了。

3.1 下单减库存

即用户下单成功时减少库存数量。

优势:用户体验友好,系统逻辑简洁。

缺点:会导致恶意下单或下单后却不买,使得真正有需求的用户无法购买,影响真实销量。

解决办法

  • 设置订单有效时间:若订单创建成功N分钟不付款,则订单取消,库存回滚
  • 限购:用各种条件来限制买家的购买件数,比如一个账号、一个ip,只能买一件
  • 风控:从技术角度进行判断,屏蔽恶意账号,禁止恶意账号购买

3.2 付款减库存

即用户支付完成并反馈给平台后再减少库存数量。

优势:减少无效订单带来的资源损耗。

缺点:因第三方支付返回结果存在时差,同一时间多个用户同时付款成功,会导致下单数目超过库存,商家库存不足容易引发断货和投诉,成本增加。

解决办法

  • 付款前再次校验库存,如确认订单要付款时再验证一次,并友好提示用户库存不足
  • 增加提示信息:在商品详情页,订单步骤页面提示不及时付款,不能保证有库存等

3.3 预扣库存

下单页面显示最新的库存,下单后保留这个库存一段时间(比如10分钟),超过保留时间后,库存释放。若保留时间过后再支付,如果没有库存,则支付失败。

优势:结合下单减库存的优点,实时减库存,且缓解恶意买家大量下单的问题,保留时间内未支付,则释放库存。

缺点:保留时间内,恶意买家大量下单将库存用完。并发量很高的时候,依然会出现下单数超过库存数。

4 恶意下单

如何解决恶意买家下单的问题?这里的恶意买家指短时间内大量下单,将库存用完的买家。

  • 限制用户下单数量

    优点:限制恶意买家下单

    缺点:用户想要多买几件,被限制了,会降低销售量

  • 标识恶意买家

    通过标识用户设备id或会员id,将用户加入黑名单,不足之处是有些用户是模拟的,识别不出来是不是真正的恶意买家。

5 支付失败

如何解决下单成功而支付失败(库存不足)的问题?

  • 备用库存

    优点:缓解部分用户支付失败的问题。

    缺点:备用库存只能缓解问题,不能从根本上解决问题。另外备用库存针对普通商品可以,针对特殊商品这种库存少的,备用库存量也不会很大,还是会出现大量用户下单成功却因库存不足而支付失败的问题。