共计 1813 个字符,预计需要花费 5 分钟才能阅读完成。
电商补货系统实战:基于事件驱动的补货 skill 架构设计与优化
背景痛点
在高并发电商场景下,传统的同步补货接口面临诸多挑战:

-
性能瓶颈 :同步阻塞式调用导致系统吞吐量急剧下降,尤其在秒杀活动期间,补货请求激增时服务响应时间呈指数级增长。
-
库存竞争 :超卖问题频发,当多个补货请求同时到达时,基于数据库行锁的库存扣减方案会产生大量死锁和超时。
-
数据一致性 :补货操作与库存更新、订单创建等操作缺乏事务隔离,可能出现部分成功导致的脏数据。
技术方案
事件驱动架构
采用发布 - 订阅模式解耦补货流程:
-
事件总线 :通过 Kafka 实现补货事件的异步传输,生产者和消费者完全隔离。
-
状态管理 :每个补货请求被建模为状态机,包含四个核心状态:
- 待处理(PENDING)
- 执行中(PROCESSING)
- 已完成(COMPLETED)
-
失败(FAILED)
-
数据存储 :
- Redis:分布式锁 + 库存缓存
- MySQL:最终一致性存储
代码实现
补货事件生产者
@RestController
public class ReplenishmentController {
@Autowired
private KafkaTemplate<String, ReplenishmentEvent> kafkaTemplate;
@PostMapping("/replenish")
public ResponseEntity<String> triggerReplenishment(@RequestBody ReplenishmentRequest request) {
// 生成唯一事件 ID
String eventId = UUID.randomUUID().toString();
// 构建补货事件
ReplenishmentEvent event = new ReplenishmentEvent(
eventId,
request.getSkuCode(),
request.getQuantity(),
System.currentTimeMillis());
// 发送到 Kafka
kafkaTemplate.send("replenishment-topic", event);
return ResponseEntity.ok("补货请求已受理");
}
}
事件消费者与分布式锁
@Service
public class ReplenishmentConsumer {
@Autowired
private RedissonClient redissonClient;
@KafkaListener(topics = "replenishment-topic")
public void consume(ReplenishmentEvent event) {
// 获取分布式锁
RLock lock = redissonClient.getLock("lock:sku:" + event.getSkuCode());
try {
// 尝试加锁,最多等待 3 秒,锁定 30 秒
if (lock.tryLock(3, 30, TimeUnit.SECONDS)) {
// 执行补货逻辑
processReplenishment(event);
}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
// 记录失败并触发补偿
handleFailure(event);
} finally {
// 确保锁被释放
if (lock.isHeldByCurrentThread()) {lock.unlock();
}
}
}
}
进阶优化
批量处理策略
-
请求合并 :对相同 SKU 的补货请求进行窗口期(如 100ms)合并
-
去重机制 :基于 Redis 的 SETNX 实现请求指纹去重
-
监控指标 :
- 补货延迟(replenishment_latency_seconds)
- 成功率(replenishment_success_rate)
- 重试次数(replenishment_retry_count)
避坑指南
-
Kafka 顺序消费 :为每个 SKU 分配独立分区保证顺序性
-
锁过期时间 :设置为业务处理时间的 2 - 3 倍
-
补偿策略 :
- 指数退避重试(1s, 2s, 4s…)
- 最大重试次数不超过 5 次
总结
通过事件驱动架构,我们成功将补货系统的吞吐量提升 10 倍,99% 的补货请求能在 500ms 内完成。关键点在于:
- 异步化处理消除同步阻塞
- 精细化的锁控制避免竞争
- 完善的监控和补偿机制确保可靠性
未来可考虑引入 Saga 模式实现跨服务事务,进一步提升系统鲁棒性。
正文完
