侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1824 篇文章
  • 累计收到 0 条评论

设计千万级并发秒杀系统

2025-12-12 / 0 评论 / 4 阅读

题目

设计千万级并发秒杀系统

信息

  • 类型:问答
  • 难度:⭐⭐⭐

考点

高并发架构,分布式事务处理,缓存策略设计,限流与熔断机制,数据一致性保障

快速回答

设计千万级并发秒杀系统的核心要点:

  • 分层削峰架构:前端静态化+CDN,网关层限流,服务层异步化
  • 库存预热:Redis集群预减库存,Lua脚本保证原子性
  • 请求过滤:令牌桶限流+恶意请求拦截
  • 最终一致性:MQ解耦下单流程,补偿机制处理异常
  • 降级熔断:Hystrix/Sentinel实现服务熔断,保护核心链路
## 解析

1. 系统架构设计

分层削峰架构

  • 接入层:Nginx反向代理+OpenResty实现请求过滤,静态资源CDN分发
  • 网关层:Spring Cloud Gateway限流(RedisRateLimiter),黑名单过滤
  • 服务层:微服务拆分(库存服务/订单服务/支付服务),线程池隔离
  • 数据层:Redis集群+MySQL分库分表(ShardingSphere)

2. 核心流程设计

秒杀流程

  1. 用户请求到达网关,令牌桶限流(每秒放行10万请求)
  2. Redis集群校验库存(预减库存使用Lua脚本保证原子性)
  3. Kafka异步处理订单,返回排队中状态
  4. 订单服务消费消息,生成订单流水
  5. 定时任务补偿未完成订单

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)