Home 谈谈如何设计一个支持10万QPS的秒杀系统?核心难点是什么?
Post
Cancel

谈谈如何设计一个支持10万QPS的秒杀系统?核心难点是什么?

谈谈如何设计一个支持10万QPS的秒杀系统?核心难点是什么?

核心设计思路围绕“限流、缓存、异步、降级”展开,匹配“高并发、高稳定性”的要求:

1. 系统架构设计(从外到内):

  • 接入层:用Nginx做负载均衡,分发请求到多个网关节点;同时配置Nginx限流(如每IP每秒10次请求),拦截无效请求;
  • 网关层:Spring Cloud Gateway,做接口鉴权、令牌桶限流(全局QPS设为10万),超过阈值返回“请求过忙”提示;
  • 应用层:微服务集群(订单、库存、用户服务各部署10个节点),用Ribbon做负载均衡,避免单节点过载;
  • 缓存层:Redis集群(主从+哨兵),提前将秒杀商品库存、商品详情缓存到Redis,查询时直接读缓存,不查数据库;库存扣减用Redis的“原子操作”(如decr命令),避免超卖;
  • 数据层:MySQL主从架构,主库负责写(如订单插入),从库负责读(如订单查询),同时用分库分表(按用户ID哈希分表),减少单表数据量;
  • 异步处理:用RabbitMQ将“订单创建”“短信通知”等非核心流程异步化,用户下单后先返回“下单成功”,后续异步完成订单入库和通知;

    2. 核心难点及解决方案:

  • 难点1:库存超卖。解决方案:Redis原子操作+MySQL乐观锁(订单入库时校验库存是否大于0);
  • 难点2:并发峰值过高导致系统崩溃。解决方案:多层限流(Nginx+网关+Redis)+服务降级(非核心服务如评价服务暂时关闭);
  • 难点3:数据一致性。解决方案:Redis库存扣减后,异步同步到MySQL;定时任务对比Redis和MySQL库存,修复不一致数据;

    3. 压测与优化:

    通过JMeter模拟10万QPS压测,优化Redis缓存命中率(从90%提升至99%)、JVM参数(调整堆内存为8G,避免GC频繁),最终系统稳定运行,秒杀成功率99.5%。

weixin.png

公众号名称:怪味Coding
微信扫码关注或搜索公众号名称
This post is licensed under CC BY 4.0 by the author.