nginx 负载均衡 POST请求失败重试问题

关于nginx负载均衡策略配置,可参考nginx 负载均衡策略

从nginx 1.9.13开始,默认情况下不重试非幂等请求(PUT、POST等),当在配置中增加失败重试配置时,如果后端服务器响应超时,Get请求会重新选择一台上游服务器进行重试,而POST请求则会返回504 Gateway Time-out,不会进行重试。


可使用以下两种方式处理POST请求失败重试问题

方式1

想在1.9.13或更高版本上继续重试PUT、POST等(非幂等)请求,可使用:

proxy_next_upstream error timeout non_idempotent;

non_idempotent参数可让POST请求在请求失败时进行重试,但POST请求的重试是不合理的重试策略,会减弱nginx的处理能力,无论是发生500错误还是timeout,服务器上的业务可能都已经执行过了,而重试会导致非幂等方法重复执行,从而导致业务问题,例如一个请求会创建了多个订单,或者收到多条短信的问题。

方式2

有时我们需要配置POST请求的失败重试,比如在3S后服务器请求失败进行重试,此时如果POST请求和GET请求都是走同一个server模块,则POST请求出现3S超时时,会返回504 Gateway Time-out的异常。

为了避免这种情况,我们可以在nginx配置中增加if判断,让POST请求走没有重试配置的模块

upstream backend {
    server localhost:8088;
    server localhost:8089;
}

server {
    listen 80;    #监听80端口

    location / {
        error_page 598 = @retry;
        error_page 599 = @no_retry;
        if ($request_method = POST) {
            return 599;
        }
        return 598;
    }

    location @retry {
        proxy_pass http://backend;
    }

    location @no_retry {
        proxy_pass http://backend;
        proxy_next_upstream off;
    }
}

幂等和非幂等

幂等:多次操作或请求的结果都是一样的,比如说查询某条数据,即使请求接口超时,再继续请求第二第三次,查询的结果都是一致的。
非幂等:每一次操作的结果都是不一样的,比如说插入某条数据,发送插入请求时,插入接口发生超时,此时调用者再进行第二次发送请求,结果还是超时,再发送第三次请求,结果数据已经多次插入进去了,但我们只需要插入一条,这就是非幂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值