前后端高并发解决方案

一、先明确高并发核心指标

  • QPS/TPS:每秒请求 / 事务数
  • 响应时间 RT:单次请求耗时
  • 并发连接数:同时在线请求数
  • 成功率、错误率、雪崩 / 熔断风险

二、前端高并发优化(入口层,第一道流量关卡)

前端是流量入口,优先做流量削峰、请求减负、就近访问

1. 静态资源优化(最大收益)

  1. 动静分离 静态资源(JS/CSS/ 图片 / 字体)单独部署 CDN,业务接口走后端服务。
  2. 资源压缩:Gzip/Brotli 压缩、图片 WebP/AVIF 格式、图片懒加载。
  3. 缓存策略:
    • 强缓存:Cache-Control: max-ageExpires
    • 协商缓存:ETagLast-Modified
  4. 合并资源、雪碧图、减少 HTTP 请求。

2. 请求层优化

  1. 接口节流 / 防抖 搜索框、按钮点击、滚动事件必加,防止短时间重复请求。
  2. 批量请求替代多次单请求,减少网络往返。
  3. 接口合并:后端聚合接口,前端一次拉取多模块数据。
  4. 预加载 / 预请求:非核心数据空闲时预取,提升体验。
  5. 分页 / 滚动分页:禁止一次性全量拉取大数据列表。

3. 限流 & 降级(前端兜底)

  1. 按钮置灰:防止用户重复提交表单。
  2. 前端限流:单位时间限制同一用户请求次数。
  3. 页面降级:高负载时隐藏非核心模块、关闭动效、切换极简模式。
  4. 本地缓存:localStorage/sessionStorage 缓存非实时数据,减少接口调用。

4. 网络与部署

  1. CDN 全局加速、DNS 预解析、HTTP/2 / HTTP/3(多路复用,降连接开销)。
  2. 多域名分片:突破浏览器同域名并发连接限制。
  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 全局唯一问题。

(二)接口 & 代码优化(低成本高收益)

  1. 接口设计
    • 接口精简:只返回前端必需字段,禁止 select *
    • 分页、限制返回条数,大数据禁用全表查询。
    • 接口幂等:防重复提交(订单、支付),用唯一单号 + 分布式锁。
  2. 代码层面
    • 减少循环嵌套、杜绝慢逻辑、同步改异步。
    • 合理使用线程池:配置核心线程、最大线程、队列,避免线程爆炸。
    • 本地缓存:Caffeine、Guava Cache,热点数据本地缓存,少走网络。
  3. 同步 → 异步(解耦 + 削峰) 非实时逻辑全部异步:日志、消息推送、短信、积分、统计。 方案:RabbitMQ / RocketMQ / Kafka 消息队列。 作用:削峰填谷,突发流量压到队列,后端匀速消费。

(三)缓存体系(重中之重,减少 DB 压力)

多级缓存架构:本地缓存 → 分布式缓存 → 数据库

  1. 本地缓存(JVM 缓存) 速度最快,无网络开销,适合热点固定数据(配置、字典、首页热门)。
  2. 分布式缓存 (Redis 为主)
    • 缓存热点数据:商品详情、用户信息、首页列表。
    • 缓存击穿 / 穿透 / 雪崩 解决方案:
      • 缓存穿透:布隆过滤器、空值缓存、接口校验。
      • 缓存击穿:互斥锁、热点数据永不过期。
      • 缓存雪崩:过期时间加随机值、Redis 集群、熔断降级。
  3. 缓存更新策略: 优先 更新数据库 + 更新缓存更新数据库 + 淘汰缓存,保证最终一致。

(四)流量管控:限流、熔断、降级、隔离(防雪崩)

高并发下不追求全量可用,优先保证核心可用

1. 限流(挡住恶意 / 过量流量)

分层限流:Nginx 限流 → 网关限流 → 应用层限流

  • 算法:令牌桶、漏桶、滑动窗口。
  • 维度:全局限流、IP 限流、用户 ID 限流、接口限流。
  • 组件:Sentinel、Gateway、Nginx。
2. 熔断(服务故障自动切断)

下游服务宕机 / 超时,立即熔断,避免级联故障。 组件:Sentinel、Resilience4j、Hystrix。

3. 降级(非核心功能暂时关闭)
  • 页面降级:关闭推荐、评论、积分。
  • 接口降级:返回兜底数据、静态默认值。
  • 区分:核心链路(下单、支付)绝不降级
4. 服务隔离
  • 线程池隔离:不同业务使用独立线程池,互不影响。
  • 机房隔离、集群隔离:单集群故障不影响全局。

(五)数据库深度优化

  1. 索引优化 合理建索引,避免失效:like % xxx、or、not in、字段隐式转换。 禁止过度索引(写性能下降)。
  2. SQL 优化 避免大事务、长事务;禁止大结果集查询;减少联表查询。
  3. 连接池优化 MySQL 连接池(Druid、HikariCP)合理配置大小,避免连接耗尽。
  4. 其他
    • 使用 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集群] → 数据库(读写分离+分库分表)

配套防护:限流 + 熔断 + 降级 + 隔离 全链路保护。


六、不同并发量级落地侧重点

  1. 低并发(QPS < 1000) 优化 SQL、索引、简单动静分离、页面缓存即可。
  2. 中并发(QPS 1000~10000) 引入 Redis 缓存、应用集群、Nginx 负载、简单限流。
  3. 高并发(QPS > 10000,秒杀 / 活动 / 直播) 多级缓存、MQ 异步削峰、读写分离、全链路限流熔断、分库分表、异地多活。

七、经典场景:秒杀高并发(实战组合拳)

  1. 前端:按钮置灰、限流、CDN、页面静态化。
  2. 网关 / Nginx:IP 限流、拦截非法请求。
  3. 应用层:Sentinel 限流熔断、接口幂等。
  4. 缓存:Redis 预存库存,预扣库存,挡住 99% 请求。
  5. 队列:剩余请求入 MQ,异步下单,削峰。
  6. 数据库:最终落地订单,短事务、行锁优化。

八、监控 & 压测(上线必备)

  1. 压测:JMeter、Gatling、Locust,模拟高流量,提前发现瓶颈。
  2. 全链路监控:SkyWalking、Pinpoint、Prometheus + Grafana 监控:QPS、RT、错误率、线程数、连接数、CPU、内存、磁盘、网络。
  3. 日志:ELK 收集日志,快速定位慢接口、慢 SQL。

九、避坑要点

  1. 不要一上来就微服务 / 分库分表,先优化缓存、SQL、集群
  2. 高并发下优先最终一致性,不强求强一致性。
  3. 杜绝单点:所有核心组件(应用、Redis、DB、MQ)必须集群。
  4. 大事务、慢 SQL、大 Key 是高并发三大杀手。
相关推荐
技术小结-李爽1 小时前
【工具】Maven二进制包目录结构说明
java·maven
Doker 多克1 小时前
Spring AI Alibaba—快速构建ReactAgent
java·开发语言·前端·ai编程
i220818 Faiz Ul1 小时前
药店管理|基于springboot + vue药店管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·美食分享系统
满怀冰雪1 小时前
第15篇-链表基础-反转链表-合并链表与快慢指针
java·算法·链表
番茄去哪了2 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq
西凉的悲伤2 小时前
redis-windows 安装 redis 到 windows 电脑
java·windows·redis·redis-windows
starsky762382 小时前
NIO与BIO的区别
java·服务器·nio
满怀冰雪2 小时前
第14篇-队列与单调队列-解决窗口最值问题的关键结构
java·算法
IT策士2 小时前
Redis 从入门到精通:缓存经典难题 —— 穿透、击穿、雪崩
数据库·redis·缓存