带来的问题
- 瞬间流量过大,系统扛不住
- 接口重复提交、重复下单、重复扣款
- 多线程争抢资源,出现超卖、数据错乱
- 数据库压力过大,查询慢、连接耗尽
- 缓存压力大,出现穿透、击穿、雪崩
- 服务调用频繁,出现服务卡顿、雪崩
- 大量请求同步阻塞,接口超时
- 分布式环境下数据一致性难保证
如何解决
问题1:瞬时流量暴增,压垮服务与数据库
解决方案:
- 网关层 :Gateway + Sentinel 做限流、防刷,拦住超额流量
- 注册发现层 Nacos: 服务多实例集群部署,水平扩容分摊流量;LoadBalancer 负载均衡分流,分散请求压力
- 流量防护层 Sentinel:
-
熔断:下游服务异常直接切断调用,避免连锁雪崩
-
降级:大流量时关停非核心业务,保住主流程
-
流量控制:控制请求进入速率,平缓涌入
- 中间件层:
-
MQ 异步削峰(Kafka/RocketMQ)同步改异步,请求快速返回,后台队列匀速消费,抹平高峰流量
-
Redis:热点数据提前预热存入 Redis,大量查询请求直接走缓存,绕过数据库
问题2:重复请求、重复下单、重复扣款
解决方案:(全层做幂等)
- 网关层 :拦截请求,提取用户 ID + 业务单号 + 唯一令牌, 借助 Redis 执行
SET NX做全局请求防重。短时间内相同标识直接驳回,不转发业务服务。 - 接口层:自定义幂等注解 + AOP
- 业务层:状态机判断(订单状态、支付状态)
- **中间件层:**生成全局幂等 Token,下单 / 扣款前校验令牌有效性,利用 Redis 原子命令实现分布式场景防重。
- 数据层 :
- 新增:唯一索引兜底
- 修改:乐观锁 version控制
问题3:并发抢资源、商品超卖、数据错乱
解决方案:(加锁控制并发争抢)
- 单机服务:本地锁 ReentrantLock /synchronized
- 分布式微服务 :Redisson 分布式锁
- 数据库层面 :
- 高并发更新:乐观锁
- 强一致低并发:悲观锁 for update
问题4:数据库查询压力大、慢查询、连接不够
解决方案:
- 引入 Redis 缓存,热点数据放缓存,少查数据库
- 读写分离 + 主从复制:写主库,读分摊从库
- 分库分表(Sharding-JDBC):数据量大水平拆分
- SQL 优化、建立索引、禁止长事务、减少联表查询
- 合理配置数据库连接池
问题5:缓存三大经典问题
- 缓存穿透:查不存在数据一直打库解决:空值缓存、布隆过滤器
- 缓存击穿:热点 key 过期瞬间并发打库解决:互斥锁、永不过期、热点数据永缓存
- 缓存雪崩:大量 key 同时过期 / Redis 宕机解决:过期时间随机错开、Redis 主从哨兵高可用、服务降级
问题6:微服务之间调用卡顿、服务雪崩
解决方案:
- 网关层:
- 统一配置接口超时时间,超时直接快速失败,不无限等待
- 路由策略优化,合理分发请求,避免单点服务压力集中
- 流量隔离,限制单服务请求频次
2. 注册发现层 Nacos:
- 服务多实例集群部署,故障实例自动健康剔除
- 配合LoadBalancer负载均衡,自动避开卡顿 / 宕机实例
- 及时刷新服务列表,快速切换可用节点
3. 远程调用层 OpenFeign:
- 远程调用优化,设置超时时间**配置合理连接超时,**避免长时间阻塞
- 精简请求参数,减少传输数据量,提升调用速度
4. 流量防护层 Sentinel(核心防雪崩):
- 熔断:下游服务失败率过高直接熔断,停止调用,防止拖垮自身
- 降级:非核心接口直接返回兜底数据,放弃远程调用
- 流量控制:限制调用 QPS,避免大量请求压垮下游
问题7:同步业务耗时久,接口超时严重
解决方案:
- 简单业务:本地 @Async 异步执行
- 高并发跨服务:MQ 消息队列异步处理
- 接口逻辑精简,只做校验与转发,复杂业务后置
问题8:分布式多服务数据不一致
解决方案:
- 合理设置数据库事务隔离级别(可重复读)
- 分布式场景使用 Seata 解决分布式事务
- 依靠 MQ 消息重试、消息可靠投递保证最终一致性
分层分析
从上至下主要7 层:客户端 → 网关 → (sentinel层→ nacos层)→ 接口层 → 业务层 → 中间件层 → 数据访问层 → 数据库层
- 前端:防抖节流,减少无效请求
- 网关 Gateway:限流、鉴权、路由、全局防重,削峰第一道拦截
- 注册中心 Nacos:服务集群部署,负载均衡分流
- 流量防护 Sentinel:熔断、降级、流量控制保护服务
- 接口层:参数校验、AOP 统一幂等
- 业务层:状态机、事务、本地锁、业务拆分逻辑管控
- 中间件层
- Redis:缓存提速、分布式锁、接口幂等
- MQ:异步、削峰、解压流量
- DAO 层:SQL 优化、读写分离
- 数据层:乐观锁 / 唯一索引兜底、读写分离、分库分表
1. 客户端层(最外层)
做的事:节流、防抖、源头控流
- 按钮防抖、短时间禁用提交按钮
- 前端请求节流,限制 1 秒内多次点击
- 预获取幂等 Token,统一携带请求
- 页面缓存静态数据,减少重复请求作用:从源头减少无效并发请求
2. 网关层(Gateway/Nginx/Sentinel)【高并发第一道大门】
核心动作:限流、削峰、防刷、全局幂等、路由
- 限流:QPS 限流、IP 限流、用户限流,超出直接拒绝
- 熔断:下游服务宕机,直接熔断不转发
- 降级:大促高峰期关闭非核心接口
- 全局幂等拦截:提取 Token / 业务单号,Redis NX 提前防重
- 负载均衡:把流量平分到多台服务
- 灰度发布:分批放量,控制流量
- 请求过滤 :拦截恶意请求、非法参数一句话:挡住 80% 无效流量,不让压力进业务服务
3. 接口层(Controller 控制层)
核心动作:参数校验、统一 AOP 幂等、快速失败
- 统一参数合法性校验,非法参数直接返回
- AOP 注解实现接口层幂等(Redis 令牌校验)
- 统一异常捕获,避免异常扩散
- 请求头统一解析、登录鉴权不做:业务逻辑、事务、复杂计算
4. 业务层(Service 核心层)【并发逻辑主战场】
核心动作:状态机、事务、异步、本地锁、业务幂等
- 状态机判断:订单 / 支付状态兜底幂等
- 事务控制:保证业务原子性
- 本地锁 :单机高并发用
synchronized / ReentrantLock - 业务拆分:同步改异步,释放接口吞吐量
- 热点数据前置判断,提前拦截无效业务
- 控制长事务,避免并发阻塞重点:决定业务走不走、能不能重复执行
5. 中间件层(Redis / MQ / 分布式锁)【高并发最强缓冲层】
Redis 做这些
- 热点缓存:商品、活动、用户信息,减轻 DB 压力
- 分布式锁:集群高并发统一互斥(下单、扣库存)
- 原子幂等:SET NX 做防重
- 防缓存击穿 / 穿透 / 雪崩
- 计数器、限流统计
MQ 消息队列 专门做:削峰填谷
- 瞬间超大并发请求异步丢进队列
- 服务匀速消费,把尖峰流量抹平
- 解耦业务,提升接口响应速度
- 消息自身做消费幂等,避免重复消费
总结中间件层三大神器
- Redis:扛热点、加分布式锁、做幂等
- MQ:削峰、异步、解压
- 分布式锁:集群并发抢资源统一控制
6. 数据访问层(Mapper/DAO)
核心动作:SQL 优化、避免慢查询
- 禁止联表多、禁止大事务、禁止全表扫描
- 分页、索引优化
- 读写分离路由(走读库 / 写库)只操作 SQL,不加业务逻辑
7. 数据库层(最终底层承压)
核心动作:锁机制、最终幂等、分库分表
- 悲观锁 :低并发强一致性
for update - 乐观锁 :高并发更新首选
version版本号 - 唯一索引:新增业务底层幂等兜底
- 分库分表:拆分海量数据,分摊并发压力
- 主从复制:读写分离,提升查询并发
- 事务隔离级别调整,平衡并发与一致性
最核心 4 个词对应层级
- 限流 → 网关层
- 削峰 → MQ 消息队列(中间件层)
- 锁 → 业务层本地锁 + 中间件分布式锁 + 数据库锁
- 幂等 → 全层级层层防护(网关→接口→业务→数据库)
- 缓存 → Redis 中间件层
- 防超卖 → 分布式锁 + 乐观锁组合