Nginx超时重试机制

2022-04-22
2707

Nginx

超时重试

一、nginx超时重试机制

在Nginx的默认配置是:在客户端请求服务器超时的情况下,Nginx会自动转发该请求到另外一台服务器上,这是Nginx的一种容错机制,所以Nginx的访问日志中会出现同一条请求而两台服务器都执行了一遍的情况,这样以来,程序如果没有做幂等性操作的话数据库会出现两条记录。

二、避免超时重试

1、第一种办法:因为后端机器无法再进行优化减少响应时间,所以可以更改nginx的超时时间,选择合适的超时时间可以避免这个问题。这样可以保证结果正常返回。

2、关闭自动切换到下台机器的功能,即将proxy_next_upstream配置为off。但是这样虽然能解决问题,但是会导致nginx的容错能力下降。

3、本质上我们只需要发送一次请求的。 所以可以采用分布式锁的方式解决

4、 本来就是Nginx的一种容错机制,这种机制在查询操作还是挺好的,如果是插入操作,那就有点问题了,如果这条插入的请求特别耗时,并且时间超过Nginx的proxy_connect_timeout时间设置,Nginx会自动将该请求转发集群中的另外一台服务器的。但是我们不能将这种机制关闭,关闭以后会影响Nginx效率的,那怎么办哪?于是想出了一个临时解决方案,专门针对耗时时间长的几个接口做一下过滤,也就是说,在Nginx的server配置标签中,专门对几个特定的url过过滤,关闭Nginx的重试机制,配置如下

三、以上现象还可能出现在以下的场景:
1、上传excel,然后服务端处理excel内容,插入到db里面的时候,可能存在多次转发导致数据重复。
2、post请求处理时间过长,可能出现重复提交的问题。


四、注意:
1、在nignxi中,超时自动重发,默认是开启的,需要关闭配置。