4. Golden Signals 之流量:流量指标(QPS/RPS)、流量模式识别、流量与容量规划

流量(Traffic)是服务画像中最先被感知的 Golden Signal。它直接反映用户请求对系统的负载程度,是容量规划、弹性伸缩和异常检测的基础。本节将深入剖析流量指标的定义、模式识别方法以及如何基于流量数据进行科学的容量规划。

4.1 核心流量指标:QPS 与 RPS

在分布式系统中,流量通常以每秒请求数(Requests Per Second, RPS)或每秒查询数(Queries Per Second, QPS)来衡量。虽然两者常被混用,但在精细化观测中存在细微差异:

指标 全称 典型场景 说明
QPS Queries Per Second 数据库、缓存、搜索引擎 侧重查询类操作,通常为读请求
RPS Requests Per Second API 网关、Web 服务器、微服务 涵盖所有类型的 HTTP 请求(GET/POST/PUT/DELETE)
TPS Transactions Per Second 支付、订单、核心交易链路 强调完整业务事务,可能包含多个 RPS
SRE 实践建议:在服务画像中,优先统一使用 RPS 作为流量入口指标,并在内部按业务维度(如接口、客户端、区域)打上标签,以便后续进行流量模式拆解。

4.2 流量模式识别

流量并非均匀分布,而是呈现出多种时间序列模式。识别这些模式是构建动态基线和异常检测的前提。常见的流量模式包括:

  • 周期性模式:以天、周、月为单位的规律性波动。例如,日间流量高峰、周末流量下降、月末结算流量激增。
  • 趋势性模式:长期上升或下降的流量变化。例如,业务增长带来的持续流量爬坡,或业务下线的流量衰减。
  • 突发性模式:短时间内流量剧烈变化,通常由营销活动、热点事件或故障引发。
  • 季节性模式:与特定季节或节假日相关的流量波动,如电商大促、春节红包等。

下图展示了典型服务在一天内的流量模式分解:

流量模式分解示意图 典型服务日流量模式分解 原始流量(含噪声) 长期趋势 周期基线(日模式) 突发 00:00 06:00 12:00 18:00 24:00 模式识别要点 1. 分离趋势与周期成分 2. 残差中检测突发异常
流量模式识别方法:
  • STL 分解:将时间序列拆分为趋势、季节性和残差三部分,适用于周期性明显的服务。
  • FFT 频谱分析:通过快速傅里叶变换识别流量中的主周期频率(如 24 小时、7 天)。
  • 动态时间规整(DTW):用于比较不同日期或不同服务之间的流量形态相似度。

4.3 流量与容量规划

容量规划的核心目标是确保系统在预期流量下仍能维持 SLO。基于流量指标的容量规划通常遵循以下步骤:

  1. 流量预测:基于历史流量模式,结合业务增长预期,预测未来一段时间(如 1 个月、1 个季度)的峰值 RPS。
  2. 单机容量基准:通过压测确定单台实例在满足延迟 SLO 前提下的最大承载 RPS。
  3. 冗余与缓冲:考虑故障转移、部署更新、流量突发等因素,预留 N+1 或 N+2 冗余。
  4. 弹性伸缩策略:设定基于 RPS 的 HPA(Horizontal Pod Autoscaler)阈值,实现动态扩缩容。

下表展示了不同流量场景下的容量规划策略对比:

流量场景 典型特征 容量策略 弹性策略
稳定型 日间波动 < 30% 固定实例数 + 少量缓冲 基于 CPU 的慢速伸缩
潮汐型 日间高峰/夜间低谷 按时间段预留不同容量 基于 RPS 的定时伸缩 + HPA
突发型 瞬时流量可达 10x 预留足够峰值容量 + 限流降级 基于 RPS 的快速伸缩 + 队列缓冲
增长型 月环比增长 > 20% 定期重新评估容量上限 预测性伸缩(Proactive Scaling)
容量规划常见误区:
  • 仅关注平均 RPS:忽略峰值 RPS 会导致容量不足。应使用 P99 或 P999 分位流量作为规划基准。
  • 忽略流量倾斜:即使整体 RPS 在阈值内,热点实例可能已过载。需结合流量分布(如一致性哈希的均衡性)进行规划。
  • 静态容量规划:业务增长和流量模式会变化,容量规划应作为持续迭代的过程,而非一次性活动。

4.4 流量异常检测实战

基于流量模式的异常检测是服务画像动态更新的关键环节。以下是一个基于滑动窗口的 RPS 异常检测伪代码示例:

# 基于滑动窗口的 RPS 异常检测
def detect_rps_anomaly(current_rps, history_window):
    """
    current_rps: 当前 1 分钟平均 RPS
    history_window: 过去 7 天同一时间窗口的 RPS 列表
    """
    # 1. 计算历史基线
    baseline_mean = np.mean(history_window)
    baseline_std = np.std(history_window)
    
    # 2. 设定动态阈值(3-sigma)
    upper_bound = baseline_mean + 3 * baseline_std
    lower_bound = baseline_mean - 3 * baseline_std
    
    # 3. 异常判定
    if current_rps > upper_bound:
        return "流量突增异常", current_rps - upper_bound
    elif current_rps < lower_bound:
        return "流量突降异常", lower_bound - current_rps
    else:
        return "正常", 0.0
进阶实践:对于具有强周期性的服务,建议使用 Holt-Winters 季节性预测模型或 Prophet 替代简单的滑动窗口均值,以更准确地捕捉节假日效应和趋势变化。

下图展示了基于流量模式的异常检测流程:

流量异常检测流程 基于流量模式的异常检测流程 实时 RPS 采集 历史模式库 动态基线生成 异常判定引擎 告警 & 事件 关键设计点 • 历史模式库需按时间窗口(如周一 10:00)对齐,消除周期影响 • 动态基线应包含趋势自适应因子,避免业务增长导致频繁误告

通过上述流程,SRE 团队可以实时感知流量异常,并将其作为服务画像动态更新的触发事件,自动调整基线、阈值和容量规划策略。