目录
一.前言
二.问题与挑战
1.库存同步效率问题
2.并发超卖问题
3.共享库存计算问题
三.核心设计方案
1.同步提效方案
2.防超卖解决方案
3.共享库存计算方案
四.回顾总结
受疫情影响,越来越多的消费者在线上购买日常消费品,进一步加速了即时消费需求,随着线上订单量显著升高,运维成本成了很大的瓶颈。传统方式由运营人员维护线下、线上库存,库存维护不及时会引发商品缺勤率升高(有库存无法售卖)、缺货出(超卖)等问题,影响用户购物体验。本文主要介绍海博库存系统是如何保证线下线上库存统一、及时、准确的一体化解决方案。
即时零售需求下,线上、线下商品销售采用一盘货模式,即线上、线下商品种类相同,销售同一份库存。为了提升用户体验,线下所有商品种类(标品、箱包品、称重品、组套品等)都能在线上售卖。库存变更的同步流程,如图所示:
线下门店库存在线上三方渠道销售会涉及到库存的计算、转换、同步等多种操作,商家实际运营过程中会出现以下几种问题。假如门店剩余库存如下列表所示:
商品名称 | 商品规格 | 库存数量 |
---|---|---|
可乐 | 瓶 | 10 |
酸奶 | 瓶 | 8 |
鸡翅 | g | 1000 |
如图所示,用户A在线下门店购买5瓶可乐,付款后库存剩余5瓶。线下库存变更后未及时同步至线上三方渠道,用户B在线上三方渠道购买6瓶可乐,结账后库存剩余4瓶,一共售卖11瓶可乐,线下门店库存发生超卖。
如图所示,用户A在到家渠道购买可乐6瓶,付款后剩余4瓶,库存变更后未及时同步至自有渠道,用户B在自有渠道购买8瓶可乐,结账后库存剩余2瓶,一共售卖14瓶可乐,线下门店库存发生超卖。
如图所示,用户A在线下门店购买酸奶4瓶,同时用户B在线上渠道购买5瓶酸奶,线上线下总共售卖9瓶酸奶,线下门店库存发生超卖。
如图所示,用户A在到家渠道购买酸奶3瓶,同时用户B在自有渠道购买6瓶酸奶,线上库存总共售卖9瓶酸奶,线下门店库存发生超卖。
线上渠道包括单品、箱包品、多规格品、组套品等多种类商品售卖,由于线下门店、线上渠道共享库存,根据门店库存换算后,如图所示,线上渠道可售库存分别为:可乐(瓶装)10瓶、可乐(提装)1提、鸡翅(500g)2份、可乐鸡翅(可乐【瓶装】*1 + 鸡翅*200g)5份。
用户A在到家渠道购买了1份可乐鸡翅, 其中可乐共享库存关联商品包括瓶装可乐和提装可乐,鸡翅关联商品500g称重鸡翅,所有关联品库存重新计算,计算量大、计算复杂、同时人工维护变更困难。
1.同步提效方案
门店库存发生变更,从门店同步到三方渠道,如果同步时间过长,三方渠道库存不准确,商家很容易发生超卖。我们需要保证同步时间在可控的范围内,避免出现超卖。解决该问题难点及分析如下:
库存变更频繁:高动销商品库存变更频繁,需提高同步效率。
同步数据量大:部分商家为保证库存准确,线下早八晚九全量同步,其他时间增量同步,同步数据量大,需提升同步频次。
三方渠道限频:线上各渠道库存同步存在限频,且限频不一致。
由上述问题可知,库存同步数据量大、流程长,会影响库存的同步性能,为了提升性能,将服务进行隔离,拆分如下两个模块,避免大量同步影响库存计算。 线下库存:主要负责库存数据的校验、过滤线上库存:主要处理海博库存的计算和渠道同步
鉴于库存同步数据量大,为避免与手动调整库存过程中发生冲突,造成库存错误,我们通过分布式锁实现并发控制;为了提高处理效率,剥离非核心业务操作,通过消息中间件异步保存流水和同步任务,同步操作是基于分布式调度框架多线程并行同步,提升同步频次和效率。
如前文所述,同步渠道采用分布式调度框架,该框架能让商家所有门店品任务,动态的分配到多个主机jvm中,通过不同的线程组并行执行。在多线程情况下,这些同步任务通过划分不同分片(每个分片为一组同步任务),每个线程执行一个或多个分片的任务,避免重复处理。
如果根据商家维度分配某个分片,在数据量大时,很容易出现任务积压;无限增加分片,可能会触发渠道限频,以上两种场景均会导致同步效率低。
如图所示,我们的策略是根据商家同步任务的情况,均衡分配任务所属分片,实现不触发渠道限频的情况下达到最高同步效率。
在实际业务场景中,除线下同步,还有手动调整、同步配置变更、线上销售等多种场景触发库存变更。每种业务场景对库存的影响和及时性要求不同。
举个案例,假如线下同步10个库存至渠道,同时商家在海博将库存手动调整为5,此场景下手动调整的优先级比线下同步高,三方渠道最终库存应该是5,否则会发生超卖。
我们的解决方案是根据特定算法和策略进行打分,分值高的任务优先同步,可实现线下变更同步控制在分钟级延迟,手动调整、线上销售同步控制在秒级延迟。
基于前面提到的数据同步方案,虽然解决了同步延迟(控制在分钟级),但是无法解决商品在低库存量时,线下线上同时销售发生超卖的问题,需要保证商品销售最大化的前提下有效控制缺货出。
从业务角度考虑,增加安全库存,可降低超卖率。
安全库存:保留固定库存只在线下门店售卖
线上可售库存 = 线下门店库存 - 安全库存
由于线下门店用户选购时间不固定,无法精准确定商品具体的安全库存值,如何合理设置安全库存?如果粗暴的将商品安全库存统一设置为4,会出现以下两种问题,如图所示:
由上图可知:8:31-9:00时段,线下门店库存为10,线上可售库存=总库存(10)- 安全库存(4), 此时线下一次卖出8个,在库存同步生效之前,加上线上可售库存6,理论上可能超卖个数=8+6-10;
10:01-10:30时段,线下门店库存为10,线上可售库存=总库存(10)- 安全库存(4),此时线下一次卖出2个,加上线上可售库存6,理论上线下门店和线上三方渠道一共销售库存个数=2+6,其中有2个库存在线上缺勤,无法售卖。
以上计算方法是在最理想的状态下进行的计算,在实际计算中,动态安全库存 ≈ 线下时段销量。
此方案通过销量预测算法,对线下门店各时段销售库存进行预测,动态设置安全库存。
基于以上动态安全库存设计,能够降低线下线上同时销售产生超卖问题,但无法避免渠道间并发销售产生的超卖,通过增加同步系数,按比例同步各渠道可售库存,降低超卖率,保证商品销售最大化,如图所示:
同步系数:线上可售库存占用线下门店库存比例
线上可售库存 = 线下门店库存 * 同步系数
线下涉及商品种类繁多(标品、箱包品、多规格称重品、组套品等),为了提升用户体验,需保证所有商品种类在线上标品化销售,并准确计算共享库存的商品库存。解决该问题难点及分析如下:
计算量大:线下门店库存发生变更、线上销售扣减库存,关联共享库存商品都需重新计算,计算量大且极易发生并发。
时效要求高:所有共享库存商品库存需保证同时变更,否则会出现库存不准确。
预占库存:线上销售未配送商品数量
线下可用库存:共享库存可用商品数量(线下门店库存-共享库存商品总预占)
可售库存:可对外销售的商品数量
现货库存:线上商品总数量(可售库存 + 预占库存)
针对计算量大,我们设计了可扩展、可编排的库存计算引擎,如图所示:
该方案支持标品、箱包品、称重品以及共享库存关联品的并行计算,保证库存变更的时效性、准确性。
库存变动中,最关键的节点就是线上销售扣减库存,扣减规则如下:
预占:+预占,-可售
调整:-预占,+可售
换货:【订单品】-预占,+可售,【换货品】+预占,-可售
出库:-预占,-现货
取消:-预占,+可售
为保证订单处理流程性能和效率,线上销售扣减库存采用mq异步消息方式处理,由于mq无法保证与实际流程一致,按照错误顺序处理库存,会导致库存数据错误。我们设计了订单状态机,在扣减库存前,进行前置状态校验,避免此问题。
订单状态机主要包括订单预占、订单调整、订单换货、订单出库、订单取消等节点,如图所示:
为方便扩展,通过配置方式维护各节点的前置状态,扣减库存前根据当前节点状态进行处理。
基于以上即时零售场景存在的痛点,我们在分析、梳理、解决这些的问题过程中沉淀了如下的库存系统架构:
库存架构从多方面进行考虑设计:
服务隔离方面,拆分线下、线上库存两个模块,线下库存负责接收ERP库存数据,并进行数据过滤、清洗,线上库存支持业务操作、库存计算和渠道数据同步。
同步效率方面,设计了动态控频同步组件,针对不同渠道动态控制同步频率,保证渠道同步效率的最大化。
拓展性方面,设计了库存计算引擎,根据不同业务场景可编排计算流程,同时支持新业务场景的拓展。
准确性方面,该架构支持全链路数据监控,保证数据在各环节的准确、可追溯;
以上为即时零售库存系统的整体设计,我们通过合理的架构设计保证了库存在整体业务流程的实时、准确、统一。