共计 2118 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
电商补货系统面临的核心挑战可以归纳为三点:
- 高并发峰值 :大促期间补货请求可能瞬间增长 100 倍以上,传统同步处理会导致服务雪崩
- 数据强一致 :库存扣减与订单生成必须保持原子性,避免超卖或数据不一致
- 系统容错性 :网络抖动、节点故障等情况不能影响核心补货流程
典型场景举例:某爆款商品库存仅剩 100 件时,突然涌入 1000 个补货请求,系统需要确保:
– 精确扣减库存
– 生成正确的采购订单
– 不丢失任何有效请求
技术选型对比
同步 vs 异步方案
- 同步调用 :
- 优点:实现简单,实时性强
- 缺点:系统耦合度高,并发能力受限于数据库性能
-
适用场景:低频次、强实时的 B2B 业务
-
异步事件驱动 :
- 优点:削峰填谷,各模块解耦
- 缺点:实现复杂度高,存在延迟
- 适用场景:高并发的 B2C 业务(推荐方案)
消息队列选型
| 维度 | Kafka | RabbitMQ |
|---|---|---|
| 吞吐量 | 100K+/s | 20K/s |
| 延迟 | 毫秒级 | 微秒级 |
| 消息堆积 | 支持 TB 级 | 受内存限制 |
| 事务支持 | 有限支持 | 完整支持 |
建议选择 :
– 超高频场景选 Kafka(需自行实现事务补偿)
– 常规场景选 RabbitMQ(利用其死信队列机制)
核心架构设计

- 领域模型 :
- 补货请求(ReplenishmentRequest)
- 库存快照(InventorySnapshot)
-
采购订单(PurchaseOrder)
-
关键流程 :
- 前端发起补货请求 → API 网关 → 消息队列
- 消费者服务:
- 校验请求有效性
- 获取分布式锁
- 检查实时库存
- 生成采购订单
- 发送通知事件
代码实现
库存检查核心逻辑
// 使用 Redis+Lua 保证原子性
String luaScript = """local current = tonumber(redis.call('GET', KEYS[1]))
if current >= tonumber(ARGV[1]) then
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1
end
return 0
""";
Long result = redisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class),
Collections.singletonList("stock:" + skuId),
String.valueOf(requestQty)
);
订单生成服务
@Transactional
public void generateOrder(ReplenishmentRequest request) {
// 1. 检查库存是否已预占
InventoryLock lock = lockRepo.findBySku(request.getSkuId());
if (lock == null || !lock.getRequestId().equals(request.getId())) {throw new BizException("库存锁定失效");
}
// 2. 生成采购单(领域事件驱动)PurchaseOrder order = new PurchaseOrder();
order.setStatus(OrderStatus.CREATED);
orderRepo.save(order);
// 3. 发布领域事件
eventPublisher.publish(new OrderCreatedEvent(order));
}
性能优化
三级缓存策略
- 本地缓存 (Caffeine):
- 缓存商品基础信息
-
过期时间 5 秒
-
分布式缓存 (Redis):
- 库存扣减预占
-
采用 Hash 结构存储
-
数据库库存 :
- 最终一致性校验
- 定时对账任务补差
批量处理示例
// 使用 Spring Batch 处理积压消息
@Bean
public Step processReplenishments() {return stepBuilderFactory.get("processReplenishments")
.<ReplenishmentRequest, PurchaseOrder>chunk(100)
.reader(batchItemReader)
.processor(batchProcessor)
.writer(batchWriter)
.build();}
生产环境考量
必须实现的监控指标
replenishment_request_total:请求总数inventory_check_duration_seconds:库存检查耗时order_generate_failed_total:订单生成失败数
异常恢复方案
- 消息重试 :
- 配置指数退避策略(1s/5s/30s)
-
最大重试 3 次后进入死信队列
-
人工干预接口 :
- 提供强制解锁库存 API
- 订单补偿生成入口
避坑指南
典型问题解决方案
- 库存超卖 :
- 采用 CAS 机制更新库存
-
预占库存与订单生成分离
-
消息重复 :
- 消费端幂等处理
-
使用 requestId+version 做唯一标识
-
分布式锁失效 :
- 锁过期时间大于业务处理时间
- 增加锁续期机制
思考与延伸
值得深入探讨的方向:
1. 如何实现跨仓库的智能补货调度?
2. 在 Serverless 架构下如何优化补货流程?
3. 机器学习预测模型与补货系统的结合点有哪些?
补货系统作为电商供应链的核心环节,需要根据业务发展阶段不断迭代优化。本文介绍的基础架构已在实际项目中验证可支撑每秒 3000+ 的补货请求,希望对大家有所启发。
正文完
