nginx超时重试机制

news/2024/7/7 21:42:15 标签: nginx, 运维, java

背景: 

发起一个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的重试机制,配置如下

java">server {
        
		
       location ~ /api/insertData {
              proxy_connect_timeout 60;
              proxy_send_timeout 60;
              proxy_read_timeout 60;
              proxy_next_upstream off;
        
        }
 }

http://www.niftyadmin.cn/n/614566.html

相关文章

关于Bentley MicroStation Design (V8)格式中的tag的处理

原文发布时间:2011-04-22 作者:叶子tag(标签),是用户自定义的一些可以挂接到元素上的属性,这些可以被FME读出和写入(只能是DGNV8格式)。另外,为了对用户自定义的属性提供…

2. 类加载子系统

来源:JVM系列-第2章-类加载子系统 | 风祈的时光录 1. 内存结构概述 注意:方法区之后HostSpot虚拟机有,J9、JRockit都没有 2. 类加载子系统的作用: 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文…

DNG V8查错的一个示例(以文本为例)

原文发布时间:2011-04-27 作者:叶子把DGN数据录入到Oracle数据库中后,再出库后,往往发现数据跟原图形不同。造成的原因很多,这里以文本为例来说明这个问题。 该图中含有的所有文本如图(共59个要素&#xff…

3. 运行时数据区概述及线程

来源:JVM系列-第3章-运行时数据区 | 风祈的时光录 纪要 1. 运行时数据区与内存 JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。 我们通过磁盘或者网络IO得到的数据,都需要先加载到内存中&#x…

FME中文本的注记对齐方式问题

原文发布时间:2011-12-01 作者:毛毛虫 翻译原文链接:https://knowledge.safe.com/content/kbentry/16546/text-justification.html 最近在处理dgn中线面叠加时,遇到注记定位点的问题,对此查找了下相关资料,…

java Comparable整理

1. 自定义类比较 Person public class Person{String name;int score;Person(String name, int score) {this.name name;this.score score;}Overridepublic String toString() {return this.name "," this.score;} } TestMain1 public class TestMain1 {publ…

把数据写入DGN的几个注意问题

原文发布时间:2012-04-09 作者:毛毛虫在进行把Oracle数据写入DGN时,遇到下面几个问题,大家以后处理类似问题时可以参考一下。 (一)多边形节点数超过5000个,会被打散为复杂多边形或线串。 &#…

java 泛型【整理版】

对java的泛型特性的了解仍旧很浅的一层&#xff0c;后续会持续完善补充 本文参考&#xff1a;java 泛型详解-绝对是对泛型方法讲解最详细的&#xff0c;没有之一、Java泛型详解&#xff1a;<T>和Class<T>的使用。泛型类&#xff0c;泛型方法的详细使用实例 1. 概述…