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 选项。否则,中间件会报告配置错误。