跳到正文
Træfɪk

Retry

如果后端服务器没有响应,retry 中间件会向该服务器重试请求指定次数。
一旦服务器响应,中间件就会停止重试,无论响应状态为何。

Retry 中间件提供可选配置,用于启用指数退避。

配置示例

# Retry 4 times with exponential backoff
http:
  middlewares:
    test-retry:
      retry:
        attempts: 4
        initialInterval: 100ms
        timeout: 60s
        maxRequestBodyBytes: 1024
        status: 
          - "400"
          - "500-599"
        disableRetryOnNetworkError: true
        retryNonIdempotentMethod: true
# Retry 4 times with exponential backoff
[http.middlewares]
  [http.middlewares.test-retry.retry]
    attempts = 4
    initialInterval = "100ms"
    timeout = "60s"
    maxRequestBodyBytes = 1024
    status = ["400","500-599"]
    disableRetryOnNetworkError = true
    retryNonIdempotentMethod = true
# Retry 4 times with exponential backoff
labels:
  - "traefik.http.middlewares.test-retry.retry.attempts=4"
  - "traefik.http.middlewares.test-retry.retry.initialinterval=100ms"
  - "traefik.http.middlewares.test-retry.retry.timeout=60s"
  - "traefik.http.middlewares.test-retry.retry.maxrequestbodybytes=1024"
  - "traefik.http.middlewares.test-retry.retry.status=400,500-599"
  - "traefik.http.middlewares.test-retry.retry.disableretryonnetworkerror=true"
  - "traefik.http.middlewares.test-retry.retry.retrynonidempotentmethod=true"
// Retry 4 times with exponential backoff

{
  // ...
  "Tags" : [
    "traefik.http.middlewares.test-retry.retry.attempts=4",
    "traefik.http.middlewares.test-retry.retry.initialinterval=100ms",
    "traefik.http.middlewares.test-retry.retry.timeout=60s",
    "traefik.http.middlewares.test-retry.retry.maxrequestbodybytes=1024",
    "traefik.http.middlewares.test-retry.retry.status=400,500-599",
    "traefik.http.middlewares.test-retry.retry.disableretryonnetworkerror=true",
    "traefik.http.middlewares.test-retry.retry.retrynonidempotentmethod=true"
  ]
}
# Retry 4 times with exponential backoff
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-retry
spec:
  retry:
    attempts: 4
    initialInterval: 100ms
    timeout: 60s
    maxRequestBodyBytes: 1024
    status: 
      - "400"
      - "500-599"
    disableRetryOnNetworkError: true
    retryNonIdempotentMethod: true

配置选项

字段 说明 默认值 必填
attempts 请求应重试的次数。 是
initialInterval 指数退避序列中的首次等待时长。
最大间隔为 initialInterval 的两倍。
未指定时,立即重试请求。
以秒或有效的时长格式定义,参阅 time.ParseDuration。
0 否
timeout 允许中间件重试请求的总时长。
以秒或有效的时长格式定义,参阅 time.ParseDuration。
0 否
maxRequestBodyBytes 定义请求体的最大大小。
更多信息见此处。
2MB 否
status 定义需要重试的 HTTP 状态码范围。
更多信息见此处。
[] 否
disableRetryOnNetworkError 向服务器传输请求时发生错误,此选项会禁用重试。
更多信息见此处。
false 否
retryNonIdempotentMethod 为非幂等方法(POST、LOCK、PATCH)启用重试。 false 否

maxRequestBodyBytes 请求体大小上限

maxRequestBodyBytes 选项控制发送给服务器的请求体最大大小。

⚠️ 重要安全注意事项

当 maxRequestBodyBytes 设为 -1 时,表示请求体大小不受限制。这可能带来显著的安全和性能影响:

  • 安全风险:攻击者可能发送极大的请求体,导致 DoS 攻击或内存耗尽。
  • 性能影响:大型请求体消耗内存和处理资源,影响整个系统的性能。
  • 资源消耗:不受限制的请求体大小可能导致非预期的资源使用情况。

建议配置

强烈建议根据具体使用场景设置合适的 maxRequestBodyBytes 值:

# For most web applications (1MB limit)
maxRequestBodyBytes: 1048576  # 1MB in bytes

# For API endpoints expecting larger payloads (10MB limit)  
maxRequestBodyBytes: 10485760  # 10MB in bytes

# For file upload authentication (100MB limit)
maxRequestBodyBytes: 104857600  # 100MB in bytes

设置 maxRequestBodyBytes 的指导原则

  • Web 表单:1–5MB 通常足以满足大多数表单提交。
  • API 端点:考虑预期最大的 JSON/XML 负载,并预留余量。
  • 文件上传:根据预期最大的文件大小设置。
  • 高流量服务:使用较小限制,避免资源耗尽。

disableRetryOnNetworkError 与 status

向服务器传输请求时,如果 TCP 层发生错误,disableRetryOnNetworkError 选项会禁用重试。 如果只希望针对特定的 HTTP 状态码重试,则可以使用 status 选项配置相关状态码。

如果将 disableRetryOnNetworkError 设为 true,就必须定义 status 选项。否则,中间件会报告配置错误。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证