4. 熔断指标:upstream_rq_pending_overflow 与 upstream_rq_retry_overflow

Envoy 的熔断器并非黑盒开关,而是通过一系列可观测指标暴露内部决策过程。在实战排障中,upstream_rq_pending_overflow 和 upstream_rq_retry_overflow 是判断熔断是否生效、以及生效在哪个阶段的核心依据。本章将深入解析这两个关键指标的含义、触发条件及关联关系。

4.1 指标全景:熔断相关的计数器

Envoy 为每个上游集群(Cluster)维护一组熔断相关的统计计数器,位于 cluster.<name>.circuit_breakers. 命名空间下。下表列出最关键的几个指标及其含义:

指标名称 类型 触发条件 典型含义
upstream_rq_pending_overflow Counter 待连接池(pending)队列已满,新请求被直接拒绝 连接池耗尽,请求排队超限
upstream_rq_retry_overflow Counter 重试次数超过熔断阈值,Envoy 放弃重试 重试风暴被熔断拦截
upstream_cx_overflow Counter 与上游的最大连接数达到上限 连接层熔断
upstream_rq_timeout Counter 请求超时(非熔断,但常伴随熔断出现) 上游响应过慢
upstream_rq_retry Counter 发生重试(无论成功或失败) 重试总次数
排障口诀:pending_overflow 看连接池排队,retry_overflow 看重试次数。两者同时飙升,说明上游已进入过载状态,熔断正在保护下游。

4.2 upstream_rq_pending_overflow:连接池排队熔断

Envoy 与上游服务之间维护了连接池。当所有连接都在处理请求时,新请求会进入 pending 队列等待空闲连接。如果 pending 队列长度超过 max_pending_requests 阈值,Envoy 会立即拒绝该请求,并递增 upstream_rq_pending_overflow 计数器。

触发流程:

  1. 客户端请求到达 Envoy。
  2. Envoy 检查连接池:所有连接繁忙,无空闲连接。
  3. 请求进入 pending 队列,等待可用连接。
  4. pending 队列长度达到 max_pending_requests(默认 1024)。
  5. Envoy 返回 503 响应,并递增 upstream_rq_pending_overflow。

典型场景:

  • 上游服务突发慢查询,导致连接池中的连接被长时间占用。
  • 上游服务实例数减少,但流量未降,连接池容量相对不足。
  • 连接池配置过小(如 max_connections: 10),无法应对突发流量。
注意:pending_overflow 不等于上游服务完全不可用。它只表示 Envoy 本地连接池的排队能力已满,上游可能仍在正常处理已有请求。此时应优先检查连接池配置和上游响应时间。

4.3 upstream_rq_retry_overflow:重试风暴熔断

Envoy 支持自动重试失败请求。但如果重试本身也失败,且重试次数过多,会形成“重试风暴”,进一步压垮上游。Envoy 通过 max_retries 熔断阈值限制重试总量,当重试次数超过该阈值时,后续重试请求会被直接拒绝,并递增 upstream_rq_retry_overflow 计数器。

触发流程:

  1. 原始请求失败(如 503、连接超时)。
  2. Envoy 根据重试策略发起重试。
  3. 重试请求再次失败,Envoy 继续重试。
  4. 累计重试次数达到集群级别的 max_retries 阈值(默认 3)。
  5. Envoy 放弃重试,返回最终错误响应,并递增 upstream_rq_retry_overflow。

典型场景:

  • 上游服务短暂抖动,重试成功但次数过多,触发熔断阈值。
  • 重试策略配置过于激进(如 retry_on: 5xx 且 num_retries: 5),导致重试风暴。
  • 多个 Envoy 实例同时向上游重试,集群级重试计数被快速耗尽。
实战建议:retry_overflow 是重试风暴的“安全阀”。如果该指标持续增长,说明上游已经无法正常处理请求,应优先排查上游健康状态,而非调整重试次数。

4.4 两个指标的关联与区别

虽然两个指标都代表熔断生效,但作用阶段不同:

对比维度 upstream_rq_pending_overflow upstream_rq_retry_overflow
熔断阶段 请求发送前(连接池排队) 重试阶段(重试次数)
触发阈值 max_pending_requests max_retries
返回状态码 503(熔断拒绝) 503(重试熔断)
对上游影响 减少新请求进入,保护连接池 减少重试流量,防止重试风暴
常见伴随指标 upstream_cx_overflow、upstream_rq_timeout upstream_rq_retry、upstream_rq_retry_success

两个指标同时飙升,通常意味着上游已经处于严重过载状态:连接池排队已满,重试也在不断失败。此时应优先恢复上游服务,而非调整熔断参数。

4.5 熔断指标关系图

下图展示了从请求到达 Envoy 到最终响应的完整流程中,两个熔断指标的触发位置:

熔断指标触发位置示意图 客户端请求 连接池检查 pending_overflow 返回 503 发送请求 上游 重试判断 retry_overflow 放弃重试 连接池满 → pending_overflow 重试超限 → retry_overflow

4.6 实战:通过指标定位熔断根因

当监控告警显示熔断发生时,可按以下步骤快速定位:

  1. 检查 pending_overflow:如果该指标增长,说明连接池排队已满。查看 upstream_rq_pending_active 和 upstream_cx_active 确认当前连接池使用率。
  2. 检查 retry_overflow:如果该指标增长,说明重试次数超限。查看 upstream_rq_retry 和 upstream_rq_retry_success 确认重试成功率。
  3. 对比两个指标:
    • 仅 pending_overflow 增长 → 连接池配置不足或上游响应慢。
    • 仅 retry_overflow 增长 → 重试策略过于激进。
    • 两者同时增长 → 上游服务严重过载,需优先恢复上游。
  4. 查看上游健康状态:结合 upstream_cx_connect_fail 和 upstream_rq_timeout 判断上游是否可用。
关键命令:使用 Envoy Admin 接口实时查看熔断状态:
curl -s http://localhost:15000/stats?filter=circuit_breakers | grep -E "pending_overflow|retry_overflow|cx_overflow"
输出示例:
cluster.my_service.circuit_breakers.default.upstream_rq_pending_overflow: 12
cluster.my_service.circuit_breakers.default.upstream_rq_retry_overflow: 3
cluster.my_service.circuit_breakers.default.upstream_cx_overflow: 0

4.7 配置示例:熔断阈值与指标关联

以下 Envoy 配置展示了熔断阈值与对应指标的映射关系:

circuit_breakers:
  thresholds:
    - priority: DEFAULT
      max_connections: 100          # 对应 upstream_cx_overflow
      max_pending_requests: 50      # 对应 upstream_rq_pending_overflow
      max_requests: 200             # 对应 upstream_rq_overflow(请求并发熔断)
      max_retries: 3                # 对应 upstream_rq_retry_overflow
      track_remaining: true         # 暴露剩余容量指标

配置中的每个阈值都对应一个熔断计数器。当实际值超过阈值时,对应的 overflow 计数器递增。通过监控这些计数器,可以精确判断熔断发生在哪个维度。

最佳实践:建议将 track_remaining: true 开启,Envoy 会额外暴露 remaining_pending、remaining_retries 等指标,便于提前预警而非事后告警。