重试机制
Envoy 支持在虚拟主机和路由级别定义重试策略,提高系统的可靠性和容错能力。
重试策略级别
- 虚拟主机级别:应用于该虚拟主机的所有路由
- 路由级别:优先级高于虚拟主机级别,独立处理
重试配置
1. 最大重试次数
Envoy 最多重试配置的最大次数。
- 默认使用指数退避算法确定重试间隔
- 可通过头部(如
x-envoy-upstream-rq-per-try-timeout-ms
)确定间隔 - 所有重试都在总体请求超时(
request_timeout
)内进行 - 默认重试次数为 1
2. 重试条件
支持基于不同条件重试请求:
重试条件 | 描述 |
---|---|
5xx | 5xx 响应码或上游无响应 |
gatewayerror | 502、503、504 响应码 |
reset | 上游完全不响应 |
connect-failure | 连接失败(如连接超时) |
envoy-ratelimited | 存在 x-envoy-ratelimited 头部 |
retriable-4xx | 可重试的 4xx 响应码(目前仅 HTTP 409) |
refused-stream | 上游重置流并返回 REFUSED_STREAM 错误 |
retriable-status-codes | 匹配 x-envoy-retriable-status-codes 头部的响应码 |
retriable-headers | 匹配 x-envoy-retriable-header-names 头部的响应头 |
3. 重试预算
重试预算限制并发请求相对于活跃请求数量的限制,防止重试流量增加总体流量。
4. 主机选择重试插件
重试期间的主机选择通常遵循与原始请求相同的过程。使用重试插件可以改变此行为。
配置示例
基本重试配置
route_config:
virtual_hosts:
- name: example_vhost
domains: ["*"]
routes:
- match:
path: /status/500
route:
cluster: example_cluster
retry_policy:
retry_on: "5xx"
num_retries: 5
主机选择重试
route_config:
virtual_hosts:
- name: example_vhost
domains: ["*"]
routes:
- match:
path: /status/500
route:
cluster: example_cluster
retry_policy:
retry_host_predicate:
- name: envoy.retry_host_predicates.previous_hosts
host_selection_retry_max_attempts: 5
请求对冲
请求对冲同时向不同主机发送多个请求,使用最先响应的上游结果。
配置示例
route_config:
virtual_hosts:
- name: example_vhost
domains: ["*"]
hedge_policy:
hedge_on_per_try_timeout: true
routes:
- match:
prefix: "/"
route:
cluster: example_cluster
重试指标
重试相关的指标包括:
envoy_cluster_retry_upstream_rq
:重试请求数量envoy_cluster_retry_upstream_rq_5xx
:5xx 重试请求数量envoy_cluster_retry_upstream_rq_connect_failure
:连接失败重试数量
最佳实践
- 仅对幂等请求启用重试
- 合理设置重试次数,避免雪崩效应
- 使用重试预算控制重试流量
- 监控重试指标,及时调整策略
- 考虑使用请求对冲提高响应速度
合理配置重试机制可以显著提高系统的可靠性和用户体验。