3. 熔断配置:Cluster 级别 circuit_breakers 配置项详解、各项阈值含义

Envoy 的熔断机制在 Cluster 级别通过 circuit_breakers 配置项进行定义。该配置控制单个上游集群(Cluster)的资源使用上限,当达到阈值时触发熔断,防止级联故障。本章逐项解析每个阈值的作用、默认值及调优方向。

3.1 circuit_breakers 配置结构

配置位于 Cluster 的 circuit_breakers 字段下,支持按优先级(default / high)分别设置。以下为典型配置结构:

circuit_breakers:
  thresholds:
    - priority: DEFAULT
      max_connections: 1024
      max_pending_requests: 1024
      max_requests: 1024
      max_retries: 3
    - priority: HIGH
      max_connections: 2048
      max_pending_requests: 2048
      max_requests: 2048
      max_retries: 6
优先级说明: HIGH 优先级通常用于控制面流量或关键探测请求,确保管理平面不受数据平面熔断影响。未显式配置 HIGH 时,默认继承 DEFAULT 阈值。

3.2 核心阈值详解

Envoy 提供 4 个核心熔断阈值,分别对应连接池、请求队列、并发请求和重试行为。下表列出各阈值的含义、统计维度及默认值:

配置项 含义 统计维度 默认值 触发效果
max_connections 与上游集群的最大并发连接数(HTTP/1.1 连接池) 每个上游端点 1024 拒绝新连接,请求进入 pending 队列
max_pending_requests 连接池满时,等待可用连接的最大请求数 每个上游端点 1024 超过后直接拒绝请求,返回 503
max_requests 与上游集群的最大并发请求数(HTTP/2 流) 每个上游端点 1024 超过后拒绝新请求,不排队
max_retries 允许的最大并发重试请求数 整个集群 3 超过后不再执行重试,直接返回原始错误
关键区别: max_connections 和 max_pending_requests 主要影响 HTTP/1.1 连接池行为;max_requests 主要影响 HTTP/2 多路复用场景。在纯 HTTP/2 网格中,max_connections 通常保持较低值,而 max_requests 成为主要限制。

3.3 阈值作用流程与熔断状态机

Envoy 在每个上游端点(Endpoint)级别维护独立的熔断计数器。请求到达时按以下顺序检查:

  1. 连接池检查: 当前连接数是否达到 max_connections?是则进入 pending 队列。
  2. 等待队列检查: pending 队列长度是否达到 max_pending_requests?是则直接拒绝。
  3. 并发请求检查: 当前活跃请求数是否达到 max_requests?是则拒绝。
  4. 重试检查: 若为重试请求,检查全局重试计数是否达到 max_retries?是则跳过重试。

以下 SVG 图展示熔断决策流程:

Cluster 级别熔断决策流程 请求到达 Cluster 检查 max_connections 连接数 < 阈值? 是 检查 max_pending_requests pending 队列 < 阈值? 是 检查 max_requests 活跃请求数 < 阈值? 是 检查 max_retries(仅重试请求) 重试计数 < 阈值? 请求通过 → 上游 拒绝请求 → 503 熔断触发条件 任一检查失败 立即拒绝请求 不排队、不重试

3.4 各阈值调优建议

阈值设置需结合上游服务容量、流量模型和资源限制。以下为常见场景的调优参考:

场景 max_connections max_pending_requests max_requests max_retries
高并发 HTTP/1.1 服务 根据连接池大小 × 端点数量 连接池的 2~3 倍 不适用(HTTP/1.1 受连接数限制) 3~5
HTTP/2 多路复用服务 保持较低值(如 100) 0(不排队) 根据 QPS × 延迟计算 2~3
延迟敏感型服务 适中 0(拒绝优于等待) 适中 1~2
批量处理/异步服务 较高 较高 较高 3~5
计算公式参考: max_requests = 预期 QPS × P99 延迟(秒)。例如 QPS=500,P99=200ms,则 max_requests = 500 × 0.2 = 100。此公式可避免因瞬时流量导致误熔断。

3.5 跟踪与统计

Envoy 为每个熔断阈值暴露详细的统计指标,便于监控和告警:

  • cluster.{cluster_name}.circuit_breakers.default.cx_open — 连接数熔断是否激活
  • cluster.{cluster_name}.circuit_breakers.default.px_open — pending 队列熔断是否激活
  • cluster.{cluster_name}.circuit_breakers.default.rq_open — 请求数熔断是否激活
  • cluster.{cluster_name}.circuit_breakers.default.retry_open — 重试熔断是否激活
  • cluster.{cluster_name}.circuit_breakers.default.remaining_* — 各阈值剩余容量
告警推荐: 建议对 cx_open、rq_open 设置告警,当熔断激活持续时间超过 5 秒时触发 P1 告警。对 remaining_* 指标设置接近 0 的预警告警,提前扩容或调整阈值。

3.6 常见配置误区

误区 错误表现 正确做法
所有阈值设置相同值 连接池与请求数互相干扰,难以定位瓶颈 根据协议和场景差异化设置
max_pending_requests 设置过大 请求长时间排队,导致延迟飙升 延迟敏感服务设为 0,批处理服务设为连接池的 2~3 倍
max_retries 设置过高 重试风暴加剧上游负载 不超过 3 次,配合重试预算使用
忽略 HIGH 优先级配置 控制面请求被数据面熔断影响 为 HIGH 优先级设置更宽松的阈值