3、Envoy超时配置详解:全局超时、路由超时、空闲超时、连接超时、重试超时等各类超时参数的含义与默认值
Envoy 的超时体系是流量治理中最容易引发“隐性故障”的环节。在回滚场景中,若上游服务已降级但 Envoy 仍按原超时策略等待响应,会导致客户端连接堆积、熔断器无法触发,最终使回滚护栏形同虚设。本节将逐一拆解 Envoy 中五类核心超时参数:全局超时、路由超时、空闲超时、连接超时与重试超时,并给出默认值与配置建议。
3.1 超时参数全景图
Envoy 的超时配置分布在 Cluster(集群)、Route(路由)和 Listener(监听器)三个层级。下图展示了各超时参数的作用位置与传递关系:
关键原则:路由超时(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 超时配置检查清单
在排查回滚护栏失效问题时,请按以下清单逐一核对超时配置:
- 路由超时是否被禁用?检查
timeout: 0或timeout: "0s",禁用超时会绕过所有超时保护。 - 重试超时是否继承路由超时?若未显式设置
retry_timeout,重试会使用路由超时,导致总等待时间 = 路由超时 × (重试次数 + 1)。 - 连接超时是否大于路由超时?连接超时若大于路由超时,连接超时永远不会触发。
- 空闲超时是否小于路由超时?对于长耗时回滚,空闲超时过小会导致连接提前关闭。
- 全局超时是否被路由超时覆盖?确认路由超时是否显式设置,若未设置则使用全局超时。
快速验证命令:使用
envoyctl config-dump 导出当前配置,搜索 "timeout" 关键字,检查所有超时字段的实际值。重点关注 dynamic_route_config 和 static_clusters 中的超时配置。