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 流量模式识别
流量并非均匀分布,而是呈现出多种时间序列模式。识别这些模式是构建动态基线和异常检测的前提。常见的流量模式包括:
- 周期性模式:以天、周、月为单位的规律性波动。例如,日间流量高峰、周末流量下降、月末结算流量激增。
- 趋势性模式:长期上升或下降的流量变化。例如,业务增长带来的持续流量爬坡,或业务下线的流量衰减。
- 突发性模式:短时间内流量剧烈变化,通常由营销活动、热点事件或故障引发。
- 季节性模式:与特定季节或节假日相关的流量波动,如电商大促、春节红包等。
下图展示了典型服务在一天内的流量模式分解:
流量模式识别方法:
- STL 分解:将时间序列拆分为趋势、季节性和残差三部分,适用于周期性明显的服务。
- FFT 频谱分析:通过快速傅里叶变换识别流量中的主周期频率(如 24 小时、7 天)。
- 动态时间规整(DTW):用于比较不同日期或不同服务之间的流量形态相似度。
4.3 流量与容量规划
容量规划的核心目标是确保系统在预期流量下仍能维持 SLO。基于流量指标的容量规划通常遵循以下步骤:
- 流量预测:基于历史流量模式,结合业务增长预期,预测未来一段时间(如 1 个月、1 个季度)的峰值 RPS。
- 单机容量基准:通过压测确定单台实例在满足延迟 SLO 前提下的最大承载 RPS。
- 冗余与缓冲:考虑故障转移、部署更新、流量突发等因素,预留 N+1 或 N+2 冗余。
- 弹性伸缩策略:设定基于 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 替代简单的滑动窗口均值,以更准确地捕捉节假日效应和趋势变化。
下图展示了基于流量模式的异常检测流程:
通过上述流程,SRE 团队可以实时感知流量异常,并将其作为服务画像动态更新的触发事件,自动调整基线、阈值和容量规划策略。