一、先明确高并发核心指标
- QPS/TPS:每秒请求 / 事务数
- 响应时间 RT:单次请求耗时
- 并发连接数:同时在线请求数
- 成功率、错误率、雪崩 / 熔断风险
二、前端高并发优化(入口层,第一道流量关卡)
前端是流量入口,优先做流量削峰、请求减负、就近访问。
1. 静态资源优化(最大收益)
- 动静分离 静态资源(JS/CSS/ 图片 / 字体)单独部署 CDN,业务接口走后端服务。
- 资源压缩:Gzip/Brotli 压缩、图片 WebP/AVIF 格式、图片懒加载。
- 缓存策略:
- 强缓存:
Cache-Control: max-age、Expires - 协商缓存:
ETag、Last-Modified
- 强缓存:
- 合并资源、雪碧图、减少 HTTP 请求。
2. 请求层优化
- 接口节流 / 防抖 搜索框、按钮点击、滚动事件必加,防止短时间重复请求。
- 批量请求替代多次单请求,减少网络往返。
- 接口合并:后端聚合接口,前端一次拉取多模块数据。
- 预加载 / 预请求:非核心数据空闲时预取,提升体验。
- 分页 / 滚动分页:禁止一次性全量拉取大数据列表。
3. 限流 & 降级(前端兜底)
- 按钮置灰:防止用户重复提交表单。
- 前端限流:单位时间限制同一用户请求次数。
- 页面降级:高负载时隐藏非核心模块、关闭动效、切换极简模式。
- 本地缓存:
localStorage/sessionStorage缓存非实时数据,减少接口调用。
4. 网络与部署
- CDN 全局加速、DNS 预解析、HTTP/2 / HTTP/3(多路复用,降连接开销)。
- 多域名分片:突破浏览器同域名并发连接限制。
- 服务端渲染 SSR / 静态站点 SSG:首屏更快,减轻客户端渲染压力。
三、后端高并发优化(核心服务层)
(一)架构层面:分布式 & 集群(横向扩容)
1. 应用集群(无状态设计)
- 服务无状态:Session 统一存入 Redis,单机可随时扩缩容。
- 负载均衡:
- 四层负载:LVS、F5(高性能,转发 TCP/UDP)
- 七层负载:Nginx、Apache(可做路由、限流、SSL、灰度)
- 扩容方式:水平扩容(加机器),拒绝垂直扩容(升配置)。
2. 微服务 / 服务拆分
按业务域拆分服务(用户、订单、商品、支付),避免单应用过载:
- 核心服务(订单、支付)独立集群,优先保障资源。
- 非核心服务(日志、消息、统计)弱依赖,可降级。
- 服务注册发现:Nacos / Eureka / Consul。
3. 读写分离(数据库核心优化)
针对数据库瓶颈最有效方案:
- 主库 :负责写操作(增删改)
- 从库 :负责读操作(查询),一主多从。
- 中间件:Sharding-JDBC、MyCat 实现读写分离、分库分表。
4. 分库分表(数据量超大时)
单表数据 > 1000W 或单库 QPS 触顶使用:
- 水平分表:按用户 ID / 订单 ID 哈希 / 范围分片。
- 垂直分库:按业务拆库(订单库、商品库)。
- 注意:跨库事务、分页、排序、ID 全局唯一问题。
(二)接口 & 代码优化(低成本高收益)
- 接口设计
- 接口精简:只返回前端必需字段,禁止
select *。 - 分页、限制返回条数,大数据禁用全表查询。
- 接口幂等:防重复提交(订单、支付),用唯一单号 + 分布式锁。
- 接口精简:只返回前端必需字段,禁止
- 代码层面
- 减少循环嵌套、杜绝慢逻辑、同步改异步。
- 合理使用线程池:配置核心线程、最大线程、队列,避免线程爆炸。
- 本地缓存:Caffeine、Guava Cache,热点数据本地缓存,少走网络。
- 同步 → 异步(解耦 + 削峰) 非实时逻辑全部异步:日志、消息推送、短信、积分、统计。 方案:RabbitMQ / RocketMQ / Kafka 消息队列。 作用:削峰填谷,突发流量压到队列,后端匀速消费。
(三)缓存体系(重中之重,减少 DB 压力)
多级缓存架构:本地缓存 → 分布式缓存 → 数据库
- 本地缓存(JVM 缓存) 速度最快,无网络开销,适合热点固定数据(配置、字典、首页热门)。
- 分布式缓存 (Redis 为主)
- 缓存热点数据:商品详情、用户信息、首页列表。
- 缓存击穿 / 穿透 / 雪崩 解决方案:
- 缓存穿透:布隆过滤器、空值缓存、接口校验。
- 缓存击穿:互斥锁、热点数据永不过期。
- 缓存雪崩:过期时间加随机值、Redis 集群、熔断降级。
- 缓存更新策略: 优先 更新数据库 + 更新缓存 或 更新数据库 + 淘汰缓存,保证最终一致。
(四)流量管控:限流、熔断、降级、隔离(防雪崩)
高并发下不追求全量可用,优先保证核心可用。
1. 限流(挡住恶意 / 过量流量)
分层限流:Nginx 限流 → 网关限流 → 应用层限流
- 算法:令牌桶、漏桶、滑动窗口。
- 维度:全局限流、IP 限流、用户 ID 限流、接口限流。
- 组件:Sentinel、Gateway、Nginx。
2. 熔断(服务故障自动切断)
下游服务宕机 / 超时,立即熔断,避免级联故障。 组件:Sentinel、Resilience4j、Hystrix。
3. 降级(非核心功能暂时关闭)
- 页面降级:关闭推荐、评论、积分。
- 接口降级:返回兜底数据、静态默认值。
- 区分:核心链路(下单、支付)绝不降级。
4. 服务隔离
- 线程池隔离:不同业务使用独立线程池,互不影响。
- 机房隔离、集群隔离:单集群故障不影响全局。
(五)数据库深度优化
- 索引优化 合理建索引,避免失效:like % xxx、or、not in、字段隐式转换。 禁止过度索引(写性能下降)。
- SQL 优化 避免大事务、长事务;禁止大结果集查询;减少联表查询。
- 连接池优化 MySQL 连接池(Druid、HikariCP)合理配置大小,避免连接耗尽。
- 其他
- 使用 MySQL 8.0+,开启缓冲池、查询缓存(按需)。
- 大字段(文本、图片)单独存储,不放在业务表。
四、核心中间件高并发优化
1. Redis(分布式缓存)
- 部署:主从 + 哨兵 / 集群,保证高可用。
- 分片:Redis Cluster 横向扩容,分摊压力。
- 优化:短 key、合理过期时间、禁用大 key、Pipeline 批量操作。
- 持久化:RDB+AOF 混合,兼顾性能与数据安全。
2. 消息队列 MQ(RocketMQ/Kafka)
- 集群部署:多 Broker、多副本,防单点故障。
- 分区 / 分片:提升并发消费能力。
- 削峰:流量洪峰写入队列,消费者匀速拉取。
- 消息可靠性:重试、死信队列、事务消息,防止丢失。
3. Nginx / 网关(Spring Cloud Gateway)
- 长连接复用、连接数调优、worker 数等于 CPU 核数。
- 统一做:限流、黑白名单、SSL 解密、路由、日志、灰度发布。
五、通用架构分层总结(标准高并发架构)
用户 → CDN → Nginx/网关 → 应用集群 →
[本地缓存 → Redis集群 → MQ集群] → 数据库(读写分离+分库分表)
配套防护:限流 + 熔断 + 降级 + 隔离 全链路保护。
六、不同并发量级落地侧重点
- 低并发(QPS < 1000) 优化 SQL、索引、简单动静分离、页面缓存即可。
- 中并发(QPS 1000~10000) 引入 Redis 缓存、应用集群、Nginx 负载、简单限流。
- 高并发(QPS > 10000,秒杀 / 活动 / 直播) 多级缓存、MQ 异步削峰、读写分离、全链路限流熔断、分库分表、异地多活。
七、经典场景:秒杀高并发(实战组合拳)
- 前端:按钮置灰、限流、CDN、页面静态化。
- 网关 / Nginx:IP 限流、拦截非法请求。
- 应用层:Sentinel 限流熔断、接口幂等。
- 缓存:Redis 预存库存,预扣库存,挡住 99% 请求。
- 队列:剩余请求入 MQ,异步下单,削峰。
- 数据库:最终落地订单,短事务、行锁优化。
八、监控 & 压测(上线必备)
- 压测:JMeter、Gatling、Locust,模拟高流量,提前发现瓶颈。
- 全链路监控:SkyWalking、Pinpoint、Prometheus + Grafana 监控:QPS、RT、错误率、线程数、连接数、CPU、内存、磁盘、网络。
- 日志:ELK 收集日志,快速定位慢接口、慢 SQL。
九、避坑要点
- 不要一上来就微服务 / 分库分表,先优化缓存、SQL、集群。
- 高并发下优先最终一致性,不强求强一致性。
- 杜绝单点:所有核心组件(应用、Redis、DB、MQ)必须集群。
- 大事务、慢 SQL、大 Key 是高并发三大杀手。