【问题标题】:Nginx upstream retry based on response基于响应的 Nginx 上游重试
【发布时间】:2019-03-04 08:27:33
【问题描述】:

并非所有 API 操作都是可重试的,因此如果可以重试操作,后端会发送一个标头 retriable = true。

Nginx: retry if the upstream response contains the retriable header怎么说?

upstream mash {
    ip_hash;
    server 127.0.0.1:8081;
    server 192.168.0.11:8081;
}

server {

    location / {
        if ($request_method = POST ) {
          proxy_next_upstream error;
        }

        if ($request_method = PUT ) {
          proxy_next_upstream error;
        }

        proxy_pass http://mash/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        
    }
}

我要实现的逻辑如下:

if(response.hasHeader('Retriable') {
   do_retry
} else{
   return_backend_response;
}

【问题讨论】:

  • 我会说这是个坏主意,但这绝对取决于您。如果您想知道,HTTP 规范有状态码 429Retry-After 标头(它也适用于 503
  • 您可以将 PUT 用于可重试请求,将 POST 用于不应重试的请求吗?
  • 你有没有想过编写一个自定义的 nginx 模块来实现它?

标签: nginx nginx-reverse-proxy


【解决方案1】:

Retrier 服务

创建第二个上游retrier,运行一个非常简单的 Web 服务器,将所有请求转发回一个特殊端口上的 nginx。然后nginx会将请求转发到mash上游。当响应返回到 nginx 时,响应将被发送到retrier,并且可以在那里执行重试逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2017-01-24
    • 2012-02-28
    • 1970-01-01
    • 2015-01-27
    • 2021-08-04
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多