易君召
发布于 2026-09-16 / 作者:易君召 / 1 阅读
0

高并发场景系统性能优化完整方案

高并发优化核心思路:先扩容,再分层,最后削峰、隔离、限流;优先优化 IO,再优化 CPU,最后业务逻辑。优化分为:架构层、应用层、存储层、网络层、运维监控层,同时配套流量治理。

基本原则:不要过早优化。先压测定位瓶颈(CPU / 内存 / IO / 锁 / 数据库),再针对性优化。

一、架构层优化

1. 水平扩容(最简单有效)

  • 无状态化设计:业务服务不保存会话,会话放 Redis,支持多实例弹性扩缩容;

  • 负载均衡:Nginx / 网关做四层 / 七层负载,轮询、加权轮询、最小连接;

  • 集群化部署:多实例部署,单点故障不影响整体。

2. 分层架构,多级缓存

缓存是高并发第一利器,减少对底层存储访问

  1. 本地缓存:Caffeine、Guava Cache(JVM 内存,速度最快,注意数据一致性、内存溢出)

  2. 分布式缓存:Redis,热点数据缓存,缓存预热、缓存过期策略

  3. CDN:静态资源(图片、js、视频)下沉到边缘节点,回源限流

缓存经典问题处理:

  • 缓存穿透:布隆过滤器、空值缓存

  • 缓存击穿:互斥锁、热点数据永不过期

  • 缓存雪崩:过期时间随机打散、集群高可用、限流降级

3. 读写分离 & 分库分表

  • 读写分离:主库写,从库读,应对读多写少场景;注意主从延迟问题

  • 分库分表:水平分表(按 uid/id 哈希 / 范围分片)、垂直分库(按业务模块拆分)

代价:分布式事务、跨库 join、分页排序、ID 生成器、数据迁移复杂度上升

4. 异步化、消息队列削峰

同步调用:请求必须等待结果,流量突增直接打垮下游 异步方案:使用 Kafka/RocketMQ/RabbitMQ,流量削峰、解耦、异步处理 适用场景:短信、日志、订单后续通知、非实时业务 注意:消息可靠性(生产者确认、持久化、死信队列)、消息重复消费(幂等)、消息堆积监控。

5. 服务拆分与隔离

  • 微服务拆分:按领域拆分,故障隔离,避免一个模块拖垮全站

  • 资源隔离:线程池隔离、信号量隔离(Sentinel/Hystrix),核心业务优先保障

  • 熔断降级:下游服务异常时快速失败,返回兜底数据,防止雪崩;非核心业务直接降级关闭

6. 流量控制:限流

防止超出系统承载能力的流量进入,保护系统。 常见限流算法:

  • 固定窗口、滑动窗口、漏桶、令牌桶(Sentinel 常用令牌桶) 限流位置:网关层(Nginx/API 网关)> 应用层 > 数据库层 策略:IP 限流、uid 限流、接口维度限流,区分普通流量和核心流量。

二、应用层优化(Java 为例,SpringBoot)

1. 减少锁竞争,优化并发模型

  • 优先无锁:CAS、原子类;避免大锁、锁粒度太大

  • 区分读写锁:读多写少场景用 ReentrantReadWriteLock

  • 避免 synchronized 锁膨胀带来开销;杜绝锁内执行 IO 操作

  • 避免伪共享,合理使用线程池:禁止手动 new Thread,统一线程池,设置合理队列、核心线程、拒绝策略;不同业务分开线程池隔离。

2. 减少 CPU 开销

  • 减少对象创建:复用对象,避免循环内频繁 new;减少大对象、短生命周期对象,降低 GC 压力

  • 字符串优化:减少字符串拼接,使用 StringBuilder

  • 序列化优化:替换 Jackson,使用 Protobuf、Hessian 等更高效序列化;减少序列化 / 反序列化次数

  • JVM 调优:

    • 选择垃圾收集器:高并发低延迟优先 G1/ZGC

    • 合理堆大小,控制新生代比例,避免 Full GC;监控 GC 停顿、对象晋升

3. 减少 IO(磁盘 / 网络 IO 是性能最大瓶颈)

  • 批量操作:批量插入、批量更新,减少网络往返;避免循环单条 DB 查询

  • 连接池优化:数据库连接池(HikariCP)、Redis 连接池,设置合理最大连接数,防止连接耗尽

  • 避免不必要远程调用:减少 RPC 调用次数,接口聚合;多并发查询用并行编排(CompletableFuture)

4. 代码与接口优化

  • 接口精简:只返回需要字段,禁止select *

  • 幂等设计:防止重复请求造成脏数据(唯一索引、token、分布式锁)

  • 参数校验前置:网关层提前拦截非法参数,减少无效请求进入业务逻辑

三、数据库优化(高并发最容易卡的地方)

1. SQL 与索引优化

  • 建立合适索引,避免索引失效(like % 前缀、函数运算、隐式转换)

  • 避免大事务:事务越长,锁持有时间越长,并发下降,死锁概率上升;拆分大事务

  • 避免长连接、慢查询;慢 SQL 监控,定期 explain 分析执行计划

  • 禁止大分页:offset 过大性能差,改用主键分页

2. 数据库本身配置

  • 调整连接数、buffer pool、日志刷盘策略;

  • 高写入场景:分表、时序库替代 MySQL;

  • 热点行问题:商品库存这类热点,可做库存分段、Redis 预扣减。

3. 存储选型匹配场景

  • 高读写热点:Redis

  • 结构化事务数据:MySQL

  • 海量日志 / 时序数据:InfluxDB、ClickHouse

  • 海量文档:MongoDB

四、网络层优化

  • Nginx 优化:长连接复用、压缩静态资源、调整 epoll 参数、连接数;

  • HTTP 协议:HTTP2/HTTP3 减少握手开销;

  • 减少跨机房调用:核心业务同机房部署,降低延迟;

  • TCP 内核参数调优:调整tcp_tw_reuse、连接队列、文件句柄数。

五、运维 & 可观测性(优化前提)

优化不能靠猜,必须靠监控和压测

  1. 压测:JMeter、Locust,模拟高并发,找到瓶颈点;基准压测、容量压测、极限压测

  2. 监控:

    • 系统指标:CPU、内存、磁盘 IO、网络、文件句柄

    • 应用指标:QPS、RT、线程池状态、GC、异常数

    • 中间件:Redis 内存、命中率、MQ 堆积、数据库慢查询、连接数

  3. 链路追踪:SkyWalking/Pinpoint,定位慢调用链路

  4. 告警:核心指标告警,提前发现问题

六、优化优先级总结(实战顺序)

  1. 先做流量治理:限流、熔断、降级,保障系统不雪崩;

  2. 引入缓存,降低 DB 压力(收益最高);

  3. 优化 SQL、索引、事务,解决数据库瓶颈;

  4. 异步化,MQ 削峰,改造同步长耗时接口;

  5. 代码、锁、JVM、连接池调优;

  6. 架构扩容、读写分离、分库分表(改动大,放后面);

  7. 内核 / 网络参数微调。

七、常见误区

  1. 上来就分库分表:分库分表是最后手段,很多场景只需要缓存 + 读写分离;

  2. 盲目加机器:不解决底层瓶颈,扩容效果有限;

  3. 只优化吞吐量不考虑 RT:高并发下延迟升高同样会压垮系统;

  4. 缓存滥用:带来数据一致性问题。