3、Envoy超时配置详解:全局超时、路由超时、空闲超时、连接超时、重试超时等各类超时参数的含义与默认值

Envoy 的超时体系是流量治理中最容易引发“隐性故障”的环节。在回滚场景中,若上游服务已降级但 Envoy 仍按原超时策略等待响应,会导致客户端连接堆积、熔断器无法触发,最终使回滚护栏形同虚设。本节将逐一拆解 Envoy 中五类核心超时参数:全局超时、路由超时、空闲超时、连接超时与重试超时,并给出默认值与配置建议。

3.1 超时参数全景图

Envoy 的超时配置分布在 Cluster(集群)、Route(路由)和 Listener(监听器)三个层级。下图展示了各超时参数的作用位置与传递关系:

Envoy 超时参数作用域与传递关系 Envoy 超时参数作用域与传递关系 Listener 层 连接超时 (connect_timeout) 空闲超时 (idle_timeout) TLS 握手超时 Route 层 路由超时 (timeout) 重试超时 (retry_timeout) gRPC 最大超时 Cluster 层 全局超时 (timeout) 连接池超时 健康检查超时 说明:下层超时若未显式配置,会继承上层默认值;路由超时优先级高于集群全局超时。
关键原则:路由超时(Route timeout)会覆盖集群全局超时(Cluster timeout)。在回滚场景中,若路由超时设置过大,即使集群全局超时已调小,请求仍会等待路由超时到期,导致回滚护栏失效。

3.2 全局超时(Cluster Timeout)

全局超时定义在 Cluster 配置的 common_http_protocol_options 或 http_protocol_options 中,是 Envoy 等待上游 HTTP 响应的总时间上限。它从请求被转发到上游开始计时,直到收到完整响应头结束。

参数 配置路径 默认值 说明
timeout Cluster.common_http_protocol_options 15s 等待完整响应头的最大时间;超时后返回 504
idle_timeout Cluster.common_http_protocol_options 无(∞) 连接空闲超时,仅对 HTTP/2 生效
max_connection_duration Cluster.common_http_protocol_options 无(∞) 连接最大存活时长,超时后强制关闭
回滚陷阱:全局超时默认 15s 看似合理,但若上游回滚后的服务响应时间超过 15s(如慢 SQL 或冷启动),Envoy 会提前返回 504,导致客户端认为回滚失败。此时应适当增大全局超时,或配合重试策略。

3.3 路由超时(Route Timeout)

路由超时定义在 RouteAction 的 timeout 字段中,是 Envoy 中优先级最高的超时参数。它会覆盖集群级别的全局超时,且对每个路由规则独立生效。

# 路由超时配置示例
routes:
- match:
    prefix: "/api/v1/rollback"
  route:
    cluster: rollback-service
    timeout: 5s                # 路由超时 5 秒
    retry_policy:
      retry_on: "5xx"
      num_retries: 3
      retry_timeout: 2s        # 重试超时 2 秒
参数 配置路径 默认值 说明
timeout RouteAction.timeout 15s 覆盖集群全局超时;设为 0 表示禁用超时
grpc_timeout_header_max RouteAction.grpc_timeout_header_max 无(∞) gRPC 请求允许的最大超时值,防止客户端设置过大超时
max_stream_duration RouteAction.max_stream_duration 无(∞) 流式请求的最大持续时间
最佳实践:回滚接口应设置独立的路由超时,建议值为正常响应 P99 的 2~3 倍。例如正常回滚耗时 3s,则路由超时设为 8~10s,避免因偶发慢请求导致误判。

3.4 空闲超时(Idle Timeout)

空闲超时控制连接在没有数据传输时的存活时间。Envoy 中有两个层级的空闲超时:

  • 连接级空闲超时:定义在 Cluster.common_http_protocol_options.idle_timeout,仅对 HTTP/2 连接生效。默认无限制,但建议显式设置以防止连接泄漏。
  • 流级空闲超时:定义在 RouteAction.idle_timeout,对单个 HTTP 流生效。若流在超时时间内未收到任何数据,Envoy 会主动关闭流。
层级 参数 默认值 作用范围
连接级 idle_timeout (Cluster) 无(∞) HTTP/2 连接空闲超时
流级 idle_timeout (Route) 无(∞) 单个 HTTP 流空闲超时
HTTP/1.1 connection_manager.codec_type AUTO HTTP/1.1 无内置空闲超时,需依赖连接管理器
回滚陷阱:若上游回滚服务处理时间较长(如 30s),但空闲超时被设为 10s,则 Envoy 会在 10s 无数据时关闭连接,导致回滚中断。对于长耗时回滚操作,建议将空闲超时设为 0(禁用)或大于路由超时。

3.5 连接超时(Connect Timeout)

连接超时控制 Envoy 与上游服务建立 TCP 连接的最大等待时间。它定义在 Cluster.connect_timeout 字段中,是网络层面的超时参数。

# 连接超时配置示例
clusters:
- name: rollback-service
  connect_timeout: 3s          # TCP 连接超时 3 秒
  per_connection_buffer_limit_bytes: 32768
  common_http_protocol_options:
    idle_timeout: 60s
参数 配置路径 默认值 说明
connect_timeout Cluster.connect_timeout 5s TCP 连接建立超时;超时后返回 503
tcp_keepalive Cluster.upstream_connection_options 系统默认 TCP keepalive 探测间隔,非超时参数但影响连接存活
调优建议:连接超时应小于路由超时。若连接超时设为 10s 而路由超时设为 5s,则路由超时会先触发,连接超时失去意义。推荐连接超时 ≤ 3s,路由超时 ≥ 5s。

3.6 重试超时(Retry Timeout)

重试超时是 Envoy 重试策略中的关键参数,控制单次重试请求的最大等待时间。它定义在 RouteAction.retry_policy.retry_timeout 中,与路由超时配合使用。

# 重试超时配置示例
retry_policy:
  retry_on: "5xx,gateway-error,connect-failure"
  num_retries: 3
  retry_timeout: 2s            # 每次重试最多等待 2 秒
  host_selection_retry_max_attempts: "5"
参数 配置路径 默认值 说明
retry_timeout RouteAction.retry_policy 无(继承路由超时) 单次重试的超时时间;未设置则使用路由超时
num_retries RouteAction.retry_policy 1 最大重试次数(不含首次请求)
retry_on RouteAction.retry_policy 5xx 触发重试的响应码或条件
回滚场景关键配置:重试超时必须小于路由超时,否则重试会吞噬路由超时的保护作用。例如路由超时 10s,重试超时 8s,则 3 次重试最多消耗 24s,远超路由超时,导致客户端等待时间不可控。推荐公式:retry_timeout × (num_retries + 1) ≤ route_timeout。

3.7 超时参数优先级与默认值汇总

下表汇总了所有超时参数的优先级顺序与默认值,方便在故障排查时快速定位:

优先级 参数名称 配置层级 默认值 超时后行为
1(最高) 路由超时 (timeout) RouteAction 15s 返回 504 Gateway Timeout
2 重试超时 (retry_timeout) RouteAction.retry_policy 继承路由超时 单次重试失败,继续下次重试或返回 504
3 全局超时 (timeout) Cluster.common_http_protocol_options 15s 返回 504(被路由超时覆盖时无效)
4 连接超时 (connect_timeout) Cluster 5s 返回 503 Service Unavailable
5 空闲超时 (idle_timeout) Cluster / RouteAction 无(∞) 关闭连接或流
回滚护栏失效根因:当路由超时被设置为 0(禁用超时)或极大值(如 300s),且重试超时未显式设置时,Envoy 会无限等待上游响应。此时即使熔断器已触发,请求仍会堆积在连接池中,导致回滚操作无法被熔断机制保护。务必为回滚接口设置合理的路由超时上限。

3.8 超时配置检查清单

在排查回滚护栏失效问题时,请按以下清单逐一核对超时配置:

  1. 路由超时是否被禁用?检查 timeout: 0 或 timeout: "0s",禁用超时会绕过所有超时保护。
  2. 重试超时是否继承路由超时?若未显式设置 retry_timeout,重试会使用路由超时,导致总等待时间 = 路由超时 × (重试次数 + 1)。
  3. 连接超时是否大于路由超时?连接超时若大于路由超时,连接超时永远不会触发。
  4. 空闲超时是否小于路由超时?对于长耗时回滚,空闲超时过小会导致连接提前关闭。
  5. 全局超时是否被路由超时覆盖?确认路由超时是否显式设置,若未设置则使用全局超时。
快速验证命令:使用 envoyctl config-dump 导出当前配置,搜索 "timeout" 关键字,检查所有超时字段的实际值。重点关注 dynamic_route_config 和 static_clusters 中的超时配置。