2. 削峰填谷基本概念

2.1 流量峰值产生原因

在分布式系统与微服务架构中,流量峰值是导致系统过载、响应延迟甚至雪崩的核心诱因。理解峰值的来源是设计削峰策略的前提。

峰值类型 典型场景 特征描述
业务突发型 秒杀、大促、抢票、热点事件 瞬时请求量可达常态的 10~100 倍,持续时间短(秒~分钟级)
定时触发型 整点签到、定时任务、批量结算 大量客户端或服务端在同一时间点发起请求,形成周期性尖峰
冷启动型 新实例上线、缓存过期、服务重启 初始阶段无缓存或连接池未预热,请求穿透至后端,造成瞬时压力
连锁放大型 重试风暴、超时堆积、熔断恢复 单点故障引发客户端重试,流量层层放大,形成二次峰值
关键指标: 峰值流量通常用 QPS(Queries Per Second)或 TPS(Transactions Per Second)衡量。削峰的目标是将 瞬时峰值 QPS 平滑为 平均处理 QPS,使系统在资源上限内稳定运行。

2.2 削峰策略分类

削峰策略按处理时机和机制可分为三大类:请求排队、缓存预热、异步处理。以下通过对比表格和流程图进行详细说明。

策略 核心原理 适用场景 典型实现
请求排队 将瞬时超量请求暂存队列,按固定速率消费 秒杀下单、API 限流、消息推送 Kafka/RabbitMQ 队列、令牌桶、漏桶算法
缓存预热 在流量到达前将热点数据加载到缓存层 冷启动、定时活动、首页推荐 Redis 预加载、本地缓存预热、CDN 预热
异步处理 将耗时操作异步化,主线程快速返回,后台消费 订单处理、日志上报、图片处理 消息队列 + Worker、CompletableFuture、事件驱动
削峰策略分类与流程对比 请求排队 请求入队 → 限速消费 队列缓冲 → 削平尖峰 后端匀速处理 缓存预热 离线计算热点数据 预加载至 Redis / 本地 流量命中缓存 → 减少穿透 异步处理 请求快速返回 ACK 任务写入消息队列 Worker 异步消费 策略选择原则 • 请求排队:适用于流量突发但后端处理能力固定的场景,如秒杀下单。 • 缓存预热:适用于冷启动或可预知的流量高峰,如大促前加载商品详情。 • 异步处理:适用于非实时性要求的耗时操作,如订单状态同步、日志写入。

2.3 削峰与冷启动的关系

冷启动阶段是系统最脆弱的时期,此时流量峰值与资源不足叠加,极易引发故障。削峰策略在冷启动场景中承担着“缓冲垫”和“加速器”的双重角色。

核心洞察: 冷启动削峰不是简单的限流,而是通过 请求排队 防止实例被瞬间压垮,通过 缓存预热 缩短启动后的慢速期,通过 异步处理 将非关键路径剥离,让系统优先处理核心请求。

冷启动削峰的三阶段模型

  1. 启动初期(0~T1): 实例刚上线,无缓存、无连接池。此时启用 请求排队,将流量控制在实例处理能力的 60% 以下,避免过载。
  2. 预热期(T1~T2): 缓存逐步填充,连接池建立。配合 缓存预热 策略,主动加载热点数据,加速系统进入稳态。
  3. 稳态期(T2 之后): 系统达到正常处理能力。削峰策略降级为常规限流,异步处理持续运行。
冷启动削峰三阶段模型 启动初期 0 ~ T1 请求排队 + 限流 预热期 T1 ~ T2 缓存预热 + 异步处理 稳态期 T2 之后 常规限流 + 异步处理 T1: 缓存命中率 > 60% T2: 缓存命中率 > 95% 💡 冷启动削峰的核心目标:在 T1 之前不丢请求,在 T1~T2 之间快速填充缓存,在 T2 之后恢复全量处理能力。

削峰策略在冷启动中的具体作用

削峰策略 冷启动中的作用 风险点
请求排队 防止实例在无缓存时被瞬时流量压垮,提供缓冲时间 队列堆积可能导致延迟增加,需设置超时与降级
缓存预热 主动加载热点数据,减少冷启动期间的缓存穿透 预热数据可能过时或不全,需配合失效策略
异步处理 将非关键路径(如日志、统计)异步化,释放主线程资源 异步任务积压可能造成数据不一致,需保证最终一致性
常见误区: 冷启动阶段单纯依赖限流(请求排队)而不做缓存预热,会导致系统长时间处于低吞吐状态;反之,只做预热而不做排队,预热期间仍可能被突发流量击穿。三种策略需组合使用,形成“排队保底 + 预热加速 + 异步分流”的立体削峰方案。