51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个线上电商与线下门店库存同步的机制,要求在订单生成后秒级内更新库存,并处理线下门店的库存调整(如促销调价、补货),请说明如何保证库存数据的一致性(如避免超卖),以及如何处理网络延迟或故障导致的同步延迟。

卫龙数字化类难度:中等

答案

1) 【一句话结论】采用“双写+异步消息+优先级队列+时间戳版本控制”模式,线上订单秒级更新线上库存,线下调整(促销、补货)按业务优先级异步处理,通过分布式锁/版本号保证一致性,网络故障时用本地缓存+重试确保数据最终一致。

2) 【原理/概念讲解】老师:库存同步的核心是“线上订单秒级响应”与“线下调整的异步处理”,需解耦并保证一致性。这里用“双写+异步消息”解耦线上与线下库存服务,同时引入“优先级队列”处理线下调整的紧急性(如紧急补货优先级高于线上订单),用“时间戳+版本号”解决版本冲突,用“分布式锁”防并发超卖。比如线下紧急补货时,消息优先级更高,先处理,避免促销时库存不足。

3) 【对比与适用场景】

模式定义特性使用场景注意点
实时同步(高优先级)线上订单直接更新线上库存,线下调整实时消费MQ延迟低,一致性高,依赖网络线上订单秒级更新,线下调整实时性要求高(如紧急补货)需高可用MQ,网络故障时同步延迟
异步同步(低优先级)线下调整通过MQ发送消息,线上库存服务异步更新解耦,缓冲延迟,最终一致性线下调整频率低或允许延迟(如常规促销)需消息持久化,处理消息积压,优先级设置

4) 【示例】
伪代码(含优先级队列与版本号+时间戳):
线上订单生成:

def create_order(order_id, product_id, quantity):
    current_stock = redis.get(f"stock:{product_id}")
    if not current_stock:
        current_stock = db.get_stock(product_id)
        redis.set(f"stock:{product_id}", current_stock)
    
    with redis.lock(f"lock:{product_id}"):
        if int(current_stock) < quantity:
            raise Exception("库存不足")
        new_stock = int(current_stock) - quantity
        redis.set(f"stock:{product_id}", new_stock)
        redis.set(f"version:{product_id}", new_stock + 1)  # 版本号
        redis.set(f"time:{product_id}", int(time.time()))  # 时间戳
    
    # 发送高优先级MQ消息(线下调整优先级高于订单)
    mq.send_message("stock_update", {"order_id": order_id, "product_id": product_id, "change": -quantity}, priority=1)
    return "订单创建成功"

线下库存调整(促销补货,优先级高):

def adjust_stock(product_id, quantity, priority=2):  # 2为高优先级
    with redis.lock(f"lock:{product_id}"):
        current_stock = redis.get(f"stock:{product_id}")
        new_stock = int(current_stock) + quantity
        redis.set(f"stock:{product_id}", new_stock)
        redis.set(f"version:{product_id}", new_stock + 1)
        redis.set(f"time:{product_id}", int(time.time()))
    
    mq.send_message("stock_update", {"product_id": product_id, "change": quantity}, priority=priority)
    return "库存调整成功"

5) 【面试口播版答案】
面试官您好,针对线上电商与线下门店库存同步的需求,我的核心方案是“双写+异步消息+优先级队列+时间戳版本控制”,兼顾秒级更新和一致性。具体来说:线上订单生成时,后端直接更新线上库存(如Redis缓存),同时通过MQ发送库存更新消息;线下调整(促销、补货)通过MQ异步同步,但设置优先级(如紧急补货优先级高于线上订单),避免影响线上订单。为保证一致性,用Redis分布式锁(悲观锁)或版本号(结合时间戳)防止并发超卖,比如订单生成时锁库存,更新后释放锁;更新库存时比较版本号和时间戳,不一致则重试。网络故障时,线上库存用Redis缓存,线下调整先更新本地缓存,然后异步发送消息,失败后用指数退避重试,确保数据最终一致。这样既能实现秒级更新,又能处理线下调整,同时保证数据一致性。

6) 【追问清单】

  • 问题1:如何设置线下调整(促销、补货)与线上订单的优先级?
    回答要点:根据业务紧急程度,如紧急补货(促销)优先级高于线上订单,通过MQ消息优先级或事务优先级区分,确保关键调整先处理。
  • 问题2:如何解决时间戳或版本号过期导致的超卖风险?
    回答要点:结合时间戳(记录更新时间)和版本号(库存变化次数),更新时同时检查两者,若时间戳或版本号过期则重试,避免冲突。
  • 问题3:如果网络延迟导致线下调整消息积压,如何保证库存最终一致?
    回答要点:消息队列持久化存储,设置消息重试机制(指数退避),并监控消息延迟,超过阈值时触发告警,确保最终同步。

7) 【常见坑/雷区】

  • 忽略线下调整的优先级设置,导致促销时库存不足,影响用户体验。
  • 时间同步问题,未使用NTP导致版本号冲突,引发超卖风险。
  • 缓存击穿/穿透未处理,导致秒级更新时缓存失效,影响性能。
  • 未区分线上与线下库存的更新逻辑,导致库存数据不一致(如线下补货后线上未同步)。
  • 网络故障时未设置重试机制,导致数据不一致或消息积压。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1