nginx超时重试机制
背景:发起一个http请求。发现如果响应时间过长,里面会有多次请求。如下:写了一个demo进行验证。control层写一个htt服务,while循环打印日志。使用域名访问会出现如下情况访问的时候是域名:19:56:40 的时候请求发起 ,线程http-nio-7001-exec-8开始执行。执行内容为每10s进行打印日志(11111)但是,到了19:57:40的时候,又可以看到一条请求,线程htt
背景:
发起一个http请求。发现如果响应时间过长,里面会有多次请求。
如下:写了一个demo进行验证。control层写一个htt服务,while循环打印日志。使用域名访问会出现如下情况
访问的时候是域名:
19:56:40 的时候请求发起 ,线程http-nio-7001-exec-8开始执行。执行内容为每10s进行打印日志(11111)
但是,到了19:57:40的时候,又可以看到一条请求,线程http-nio-7001-exec-10
这个不是我这里手动发起的,经过友人提点:nginx超时重试机制,目前超时时间1分钟
问题剖析
nginx的重试机制就是容错的一种,在nginx的配置文件中,proxy_next_upstream
项定义了什么情况下进行重试,官网文档中给出的说明如下
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off
Default: proxy_next_upstream error timeout;
Context: http, server, location默认情况下,当请求服务器发生错误或超时时,会尝试到下一台服务器
在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的重试机制,配置如下
server { location ~ /api/insertData { proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream off; } }
更多推荐
所有评论(0)