4. 流量信号详解:QPS/RPS的测量、流量突增的识别、流量与容量规划的关系

流量(Traffic)是Golden Signals中第一个也是最具实时性的信号。它直接反映用户请求对系统的压力,是触发告警和弹性伸缩的最快依据。本节将深入QPS/RPS的测量方法、流量突增的识别策略,以及如何将流量数据转化为容量规划的决策依据。

4.1 QPS与RPS:定义与测量粒度

在微服务和API网关场景中,QPS(Queries Per Second)和RPS(Requests Per Second)通常混用,但严格区分时:

指标 适用场景 典型测量对象 注意事项
QPS 数据库、缓存、搜索引擎 SELECT / GET 操作 可能包含内部重试,需去重
RPS HTTP API、网关、负载均衡 HTTP Request(含4xx/5xx) 区分成功请求与错误请求

在SRE实践中,我们通常使用速率(Rate)而非原始计数器来测量流量。推荐使用PromQL中的 rate() 或 irate() 函数,避免因计数器重置导致的尖刺。

测量黄金公式:
rate(http_requests_total[1m]) —— 1分钟平均RPS,适合告警。
irate(http_requests_total[20s]) —— 瞬时RPS,适合仪表盘实时展示。

4.2 流量突增的识别:从基线到异常

流量突增不一定是坏事(例如促销活动),但非预期的突增往往是故障的前兆。识别突增需要建立动态基线。

4.2.1 基线建立方法

  • 时间窗口基线:取过去7天同一时刻的P50/P95值作为参考。
  • 同比/环比基线:对比上周同日或前一小时流量。
  • 预测基线:使用ARIMA或Prophet模型预测未来流量。

4.2.2 突增检测算法

方法 原理 适用场景 误报率
固定阈值 超过值(如>10000 QPS) 已知容量上限 高(业务波动大时)
百分比突增 相比前一分钟增长>200% 突发流量 中
3-sigma异常检测 偏离均值超过3个标准差 周期性流量 低
移动平均+偏差 EWMA(指数加权移动平均) 趋势变化检测 低
避坑提示:不要仅依赖“流量突增”一个维度告警。流量突增+错误率上升才是真正的故障信号;流量突增+延迟下降可能是缓存命中率提高的正常现象。
流量突增识别与分级响应流程 流量突增识别与分级响应流程 实时流量采集 动态基线对比 突增判定 分级响应 自动弹性伸缩 限流/降级 说明:突增判定后,若流量在容量范围内则触发自动伸缩;若超过容量上限则触发限流/降级保护。

4.3 流量与容量规划的关系

流量信号是容量规划的输入源头。没有准确的流量预测,容量规划就是盲人摸象。以下是流量驱动容量规划的核心链路:

  1. 历史流量分析:提取过去N个月的QPS/RPS趋势,识别季节性规律(如双11、月末结算)。
  2. 流量模型建立:将流量分解为“基线流量 + 增长趋势 + 周期性波动 + 突发余量”。
  3. 容量映射:将QPS转换为资源需求(CPU/内存/连接数)。例如:单实例可承载2000 QPS,目标利用率60%,则预留余量。
  4. 规划输出:生成未来1-6个月的实例数/集群规模建议。
容量规划经验公式:
所需实例数 = ceil( 预测峰值QPS / (单实例承载QPS × 目标利用率) )
例如:预测峰值 50000 QPS,单实例承载 2000 QPS,目标利用率 60%,则需 ceil(50000 / (2000 × 0.6)) = 42 个实例。

4.3.1 流量与容量映射矩阵

流量特征 对容量的影响 规划策略
平稳增长(5-10%/月) 线性扩容 提前2周扩容,预留20% buffer
突发脉冲(秒级翻倍) 瞬时压力巨大 HPA + 队列缓冲 + 限流
周期性波峰(每日/每周) 可预测的峰值 定时弹性伸缩(Cron HPA)
促销活动(计划内突增) 10-50倍流量 提前压测 + 资源预留 + 降级预案
流量驱动容量规划架构 流量驱动容量规划架构 历史流量数据 QPS/RPS 时序 流量分析引擎 趋势 + 周期 + 突发 容量规划输出 实例数 / 集群规模 弹性伸缩执行 反馈闭环:弹性伸缩后的实际流量数据再次进入历史流量数据,形成持续优化的容量规划循环。

4.4 实战:从流量突增到MTTR优化

当流量突增导致故障时,MTTR的优化体现在以下环节:

  • 检测(MTTD):流量突增告警应在10秒内触发,避免依赖人工巡检。
  • 定位:通过流量拓扑图快速判断突增来源(哪个API、哪个客户端、哪个地域)。
  • 响应:自动触发弹性伸缩或限流,无需人工审批。
  • 恢复:流量回归基线后自动缩容,释放资源。
最佳实践:在仪表盘上同时展示“当前RPS / 容量上限 / 预测RPS”三条曲线。当当前RPS接近容量上限时,提前告警,而不是等到超限后才响应。这能将MTTR从“被动救火”转变为“主动预防”。