3. 流量(Traffic)深度解析:流量指标的定义、QPS/RPS/TPS的区别、流量突增与突降的监控策略

流量(Traffic)是衡量服务系统负载的核心信号,它直接反映了用户对系统的需求强度。在SRE实践中,对流量指标的精准定义与监控,是保障服务稳定性、进行容量规划与弹性伸缩的基础。本节将深入解析流量的本质、核心指标差异以及应对流量突变的监控策略。

3.1 流量指标的定义与核心维度

流量指标描述了系统在单位时间内接收到的请求数量。一个完整的流量定义通常包含以下三个核心维度:

  • 请求来源:区分用户请求、内部服务调用、定时任务、外部回调等。
  • 请求类型:区分读请求(GET/QUERY)、写请求(POST/PUT/DELETE)、长连接、流式请求等。
  • 请求路径:区分不同的API端点、微服务接口或资源路径。
最佳实践: 在定义流量指标时,建议按“来源 + 类型 + 路径”的标签体系进行打点,以便在监控时快速下钻定位问题。

3.2 QPS / RPS / TPS 的区别与适用场景

这三个术语经常被混用,但在严谨的SRE场景下,它们有明确的区别。理解这些差异有助于选择正确的指标来评估服务健康度。

指标 全称 核心定义 典型适用场景 示例
QPS Queries Per Second 每秒查询数。通常指读请求,强调对数据或状态的查询操作。 搜索引擎、数据库读库、缓存服务、内容分发网络(CDN) 用户搜索商品、查询订单状态
RPS Requests Per Second 每秒请求数。最通用的流量指标,涵盖所有类型的HTTP请求(GET、POST、PUT等)。 API网关、Web服务器、微服务入口、负载均衡器 用户登录、提交表单、上传文件
TPS Transactions Per Second 每秒事务数。强调一个完整的业务操作单元,可能包含多个子请求。 支付系统、订单系统、数据库事务、核心业务链路 用户下单(包含库存扣减、支付、物流创建等多个步骤)
关键区别: QPS 是 RPS 的子集(仅限查询类);TPS 是 RPS 的上层抽象,一个 TPS 可能对应多个 RPS。在微服务架构中,RPS 是最常用的基础流量指标,而 TPS 更适合衡量端到端的业务吞吐能力。

3.3 流量突增与突降的监控策略

流量突变(无论是突增还是突降)都是服务不稳定的重要信号。SRE需要建立分层级的监控策略来应对。

3.3.1 流量突增的监控与应对

流量突增通常由营销活动、热点事件、爬虫攻击或上游服务重试风暴引起。监控策略应聚焦于“快速发现”与“自动防护”。

  • 基线对比告警:基于历史同期(如昨日同时段、上周同一天)的流量数据,设定动态阈值。当当前流量超过基线 200% 或 300% 时触发告警。
  • 速率限制(Rate Limiting):在网关层配置基于用户、IP或的速率限制,防止单点流量冲垮后端。
  • 自动弹性伸缩:结合容器编排平台(如Kubernetes),配置基于RPS指标的HPA(Horizontal Pod Autoscaler),实现自动扩容。
  • 熔断降级:当下游依赖服务因流量突增而响应变慢时,上游服务应主动熔断,避免级联故障。
避坑指南: 流量突增时,不要只关注RPS。必须同时观察错误率和响应延迟。如果RPS上升但错误率同步飙升,说明系统已过载,此时扩容可能已来不及,需要优先执行降级或限流。

3.3.2 流量突降的监控与应对

流量突降往往比突增更隐蔽,但同样危险。它可能意味着用户流失、网络分区、DNS解析失败或上游服务故障。

  • 零流量告警:对于核心业务接口,设置“连续N分钟流量为0”的告警,这通常是严重故障的标志。
  • 同比/环比下降告警:当流量相比历史基线下降超过 50% 或 80% 时触发告警,用于发现非突发性的流量异常。
  • 多维度下钻:当总流量下降时,立即按“机房”、“可用区”、“版本”、“运营商”等维度下钻,快速定位是局部故障还是全局问题。
  • 健康检查与自动恢复:确保负载均衡器的健康检查机制正常工作。当检测到后端实例流量为0时,自动重启或摘除异常实例。

3.4 流量监控架构图

下图展示了一个典型的流量监控与自动化响应架构,涵盖了从数据采集到策略执行的完整链路。

流量监控与自动化响应架构 流量监控与自动化响应架构 用户请求 / 外部流量 API网关 / 负载均衡 流量指标采集 (RPS/QPS) 监控与告警系统 自动化策略执行 后端服务集群 说明: 流量指标从网关采集后,进入监控系统进行基线对比与异常检测,触发自动化策略(限流/扩容/熔断),最终作用于后端服务或网关。

3.5 流量突变监控策略对比表

下表总结了针对流量突增与突降的不同监控策略及其核心关注点:

策略类型 流量突增 流量突降
告警触发条件 超过基线阈值(如 200%) 低于基线阈值(如 50%)或持续为 0
核心关注指标 RPS、错误率、延迟 P99、CPU 使用率 RPS、上游服务健康状态、DNS 解析成功率
自动化响应动作 自动扩容、限流、熔断降级 自动重启、摘除异常节点、回滚版本
典型误报场景 定时任务、数据回刷、正常业务高峰 用户非活跃时段、计划内维护、前端缓存命中率提升
优化方向 动态基线、多维度限流、容量规划 多维度下钻、健康检查增强、混沌工程演练

3.6 流量指标采集代码示例

以下是一个使用 Prometheus 客户端库(Python)采集 RPS 指标的示例,展示了如何通过标签区分不同维度的流量:

from prometheus_client import Counter, start_http_server
import time

# 定义一个计数器指标,用于统计每秒请求数
# 通过 labels 区分请求方法、路径和状态码
REQUEST_COUNT = Counter(
    'http_requests_total',
    'Total HTTP Requests',
    ['method', 'endpoint', 'status']
)

def process_request(method, endpoint):
    # 模拟请求处理
    status = "200"  # 假设请求成功
    # 增加计数器
    REQUEST_COUNT.labels(method=method, endpoint=endpoint, status=status).inc()

if __name__ == '__main__':
    # 启动 Prometheus HTTP 服务,用于暴露指标
    start_http_server(8000)
    while True:
        # 模拟收到请求
        process_request("GET", "/api/users")
        process_request("POST", "/api/orders")
        time.sleep(0.1)
监控要点: 在实际生产环境中,建议将 RPS 指标按 method、endpoint、status_code、version 等维度进行细分。这样在流量突增时,可以快速定位是哪个接口或哪个版本的服务出现了异常。