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)级别维护独立的熔断计数器。请求到达时按以下顺序检查:
- 连接池检查: 当前连接数是否达到
max_connections?是则进入 pending 队列。 - 等待队列检查: pending 队列长度是否达到
max_pending_requests?是则直接拒绝。 - 并发请求检查: 当前活跃请求数是否达到
max_requests?是则拒绝。 - 重试检查: 若为重试请求,检查全局重试计数是否达到
max_retries?是则跳过重试。
以下 SVG 图展示熔断决策流程:
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 优先级设置更宽松的阈值 |