题目
设计千万级并发秒杀系统
信息
- 类型:问答
- 难度:⭐⭐⭐
考点
高并发架构,分布式事务处理,缓存策略设计,限流与熔断机制,数据一致性保障
快速回答
设计千万级并发秒杀系统的核心要点:
- 分层削峰架构:前端静态化+CDN,网关层限流,服务层异步化
- 库存预热:Redis集群预减库存,Lua脚本保证原子性
- 请求过滤:令牌桶限流+恶意请求拦截
- 最终一致性:MQ解耦下单流程,补偿机制处理异常
- 降级熔断:Hystrix/Sentinel实现服务熔断,保护核心链路
1. 系统架构设计
分层削峰架构:
- 接入层:Nginx反向代理+OpenResty实现请求过滤,静态资源CDN分发
- 网关层:Spring Cloud Gateway限流(RedisRateLimiter),黑名单过滤
- 服务层:微服务拆分(库存服务/订单服务/支付服务),线程池隔离
- 数据层:Redis集群+MySQL分库分表(ShardingSphere)
2. 核心流程设计
秒杀流程:
- 用户请求到达网关,令牌桶限流(每秒放行10万请求)
- Redis集群校验库存(预减库存使用Lua脚本保证原子性)
- Kafka异步处理订单,返回排队中状态
- 订单服务消费消息,生成订单流水
- 定时任务补偿未完成订单
3. 关键技术实现
Redis库存预减:
-- Lua脚本保证原子性
local stock = redis.call('get', KEYS[1])
if stock and tonumber(stock) > 0 then
redis.call('decr', KEYS[1])
return 1
end
return 0消息队列解耦:
// Spring Boot集成Kafka示例
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void seckill(String userId, String itemId) {
// 库存校验通过后
kafkaTemplate.send("seckill_orders",
JSON.toJSONString(new OrderRequest(userId, itemId)));
}4. 数据一致性保障
- 缓存与数据库同步:先更新数据库再删缓存(Cache-Aside)
- 最终一致性:MQ事务消息+本地事务表
- 库存超卖防护:Redis分布式锁+数据库乐观锁
5. 容灾与降级
- 限流策略:
- 网关层:令牌桶算法(Guava RateLimiter)
- 服务层:Semaphore控制并发线程数
- 熔断机制:Sentinel配置QPS阈值熔断
- 降级方案:关闭非核心功能(如评论服务)
6. 常见错误与解决方案
| 错误类型 | 解决方案 |
|---|---|
| 缓存击穿 | 热点Key永不过期+本地缓存 |
| DB压力过大 | 读写分离+分库分表 |
| 订单重复 | Redis防重Token+数据库唯一索引 |
| 网络抖动 | 重试机制+幂等设计 |
7. 扩展知识
- 热点探测:实时监控Redis Key访问频率,自动隔离热点数据
- 动态扩容:Kubernetes HPA根据CPU自动扩缩容
- 压测方案:JMeter分布式压测,全链路监控(SkyWalking)