重试机制

Envoy 支持在虚拟主机和路由级别定义重试策略,提高系统的可靠性和容错能力。

重试策略级别

  • 虚拟主机级别:应用于该虚拟主机的所有路由
  • 路由级别:优先级高于虚拟主机级别,独立处理

重试配置

1. 最大重试次数

Envoy 最多重试配置的最大次数。

  • 默认使用指数退避算法确定重试间隔
  • 可通过头部(如 x-envoy-upstream-rq-per-try-timeout-ms)确定间隔
  • 所有重试都在总体请求超时(request_timeout)内进行
  • 默认重试次数为 1

2. 重试条件

支持基于不同条件重试请求:

重试条件描述
5xx5xx 响应码或上游无响应
gatewayerror502、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:连接失败重试数量

最佳实践

  • 仅对幂等请求启用重试
  • 合理设置重试次数,避免雪崩效应
  • 使用重试预算控制重试流量
  • 监控重试指标,及时调整策略
  • 考虑使用请求对冲提高响应速度

合理配置重试机制可以显著提高系统的可靠性和用户体验。

文章导航

章节内容

这是章节的内容页面。

章节概览