
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) 【追问清单】
7) 【常见坑/雷区】