问题描述
相关组件:
1. WebService:对外提供web接口服务,这里启动了5个(端口分别为:9001-9005)
2. nginx:反向代理5个webService做负载均衡(nginx对外提供9999端口服务)
3. httpclient:调用nginx的9999端口访问webService提供的http接口
timeout设置:
nginx:proxy_read_timeout 设置成了100s
httpclient:timeout默认20s
业务逻辑:
1. httpclient通过nginx的9999端口,调用webservice提供的接口,获取返回的结果,并进行处理。
2. httpclient发生超时时,会自动进行retry,再次调用webService接口。
3. httpclient有多个,用于不同的外部服务
问题复现:
1. 其中一个httpclient调用了webService的一个查询接口(假设对1000万条记录进行全表扫描),执行这个查询的时间远大于30s
2. httpclient在20s时没有收到webService的返回,发生timeout,进行自动retry,再次调用webservice的接口
3. 每次retry被nginx分发到不同的webservice(9001-9005)上去执行,每个webService都被全表扫描阻塞。多次retry后,直接导致所有的webService因为这个请求而阻塞,所有httpclient发送来的请求都超时、retry,陷入恶性循环,雪崩发生。
4. httpclient的超时设置是20s,但是nginx设置的 proxy_read_timeout 为100s,假设 webservice在40s的时候完成查询,并通过nginx返回了结果。但是此时httpclient已经在20s的时候就超时结束了,导致webservice返回的结果并没有收到。
问题分析
这里有三个问题:
1. httpclient超时后,一直retry,nginx会把请求分发到后端的所有webservice里,导致所有webservice全都 去执行全表扫描,无法再对外服务。
2. httpclient的超时设置和nginx的超时设置不一致,导致nginx返回了结果,但是httpclient却始终无法接收 到。
3. webservice被一个全表扫描的请求阻塞时,并没有被nginx的upstream策略剔除,会有新的请求分配到这个webservice,导致新的请求也timeout。
问题解决
对于三个问题,分别的解决方式如下:
1. 对于可能执行全表扫描这种危险操作的请求,通过添加索引等方式进行优化,缩短查询时间,并且禁止进行retry。
2. 将proxy_read_timeout设置成19秒(也就是小于等于httpclient的超时时间),保证超时的统一性。避免httpclient超时,而nginx还没有超时的情况。
3. nginx有max_fails和fail_timeout两个设置,max_fails=1 fail_timeout=120s; 表示server如果在120s内发生一次失败(超时或者拒绝连接)则将该server剔除出去,不再向其分发请求,120秒后再恢复服务。
如下例子:
server 127.0.0.1:9001 max_fails=1 fail_timeout=120s;
server 127.0.0.1:9002 max_fails=1 fail_timeout=120s;
server 127.0.0.1:9003 max_fails=1 fail_timeout=120s;
}
这表示,如果webservice中的server发生一次超时,就停止服务2分钟。2分钟以后再恢复服务。
相关推荐
在MySQL数据库操作中,"SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded" 是一个常见的错误,它意味着在执行事务时,系统等待锁定资源的时间超过了预设的限制。这个错误通常发生在并发环境中,当...
错误提示: user: ‘root’ host: `localhost’ (Got timeout reading communication packets) MYSQL server has gone away ...这两个值是一个全局变量,可以动态增加,如: mysql> set global interactiv
在本文中,我们将分析一个常见的线上问题,即目标服务器返回失败(The target server failed to respond)。我们将从多个方面分析这个问题,包括网络协议、服务器配置、客户端配置等。 网络协议 在分析这个问题...
`timeout`可以设置为单一值,表示连接和读取的总超时时间,或者设置为一个元组,分别指定连接超时和读取超时。官方建议将连接超时设置为3的整数倍稍大的值,如3.05或6.05秒,以适应网络波动。 然而,即使设置了`...
这个后端系统可能涉及到以下关键知识点: 1. **DateTime类**:PHP中的DateTime类允许我们创建、格式化和操作日期和时间对象。例如,可以创建一个新的DateTime实例,添加或减去时间间隔,以及比较日期。 2. **...
timeout 又可以细分为 connect timeout、read timeout、write timeout 怎样修改linux操作系统的tcp connect timeout
在Android应用开发过程中,开发者经常会遇到“Failed to install .apk on device 'emulator-5554': timeout”这样的错误,这通常是由于安装APK到设备(通常是Android模拟器)时超时导致的。这个错误可能会影响开发...
这个错误码表示 SMTP 服务器有一个并发连接数限制,超过这个限制将导致 SMTP 服务器拒绝提供服务。解决方法是请收信者和邮件管理者确认收信端邮件服务器是否正常作业,并且检查 SMTP 服务器的并发连接数限制。 422....
"命令timeout"是DOS(磁盘操作系统)环境中一个非常实用的工具,它允许用户设置一个等待时间,如果在此期间没有接收到任何输入,程序就会自动退出或执行下一条命令。这个功能在编写批处理脚本或者需要控制程序执行...
报错如下 报错: ORA-12170:TNS connect timeout occurred 第一反应是监听没开: 1. 测试了一下, 连接超时没用ping 通 C:\Users\Administrator>tnsping brorcl TNS Ping Utility for 64-bit Windows: Version 11.2...
TIHLDE是 (组织的主要网站)的开源后端。 :rocket: 入门 Lepton需要Python 3.6或更高版本,Docker和Docker Compose。 其他服务由Docker处理。 # Setup a local repository git clone ...
使用timeout属性,开发者可以自行决定在什么情况下放弃等待服务器的响应,从而执行其他操作,比如再次发起请求或者给用户一个错误提示。 举个简单的例子,如果我们希望一个Ajax请求最多等待4秒钟,可以这样设置: ...
`wait_timeout`是MySQL服务器中的一个系统变量,它定义了在交互式会话(即没有显式启动事务的会话)中,如果客户端在指定时间内没有发送任何新的命令,服务器将关闭该连接的等待时间。默认值通常为8小时(8*60*60秒...
SERVER_TIMEOUT(解决方案).md
为了解决“connect timeout”的问题,我们需要深入分析数据包在网络传输过程中的各个环节,并识别可能导致数据包丢失的因素。下面将详细介绍整个流程中的关键环节及其潜在问题。 ### 数据包接收流程 1. **物理网卡...
"timeout-then" 库解决了这个问题,它允许我们在执行 then 方法时指定一个超时时间,如果在这个时间内 promise 未 resolve 或 reject,就会自动 reject,返回一个超时错误。 使用 "timeout-then" 库非常简单。首先...
This is proxy server for udp backend servers, with access control, load balance ,timeout , and retransmission. 编译 make clean; make 配置 [global] ;listen directive is used for the address to ...
近期在进行毕业设计项目时遇到了一个问题:在Linux环境下利用`net-snmp`工具收集周边活动主机的信息状态时出现了时间超时(Time-Out)的情况。具体来说,通过执行`snmpwalk -v2c -c public localhost if`命令对`...
在这个例子中,如果`asyncTask()`在1500毫秒内没有完成,`timeout()`会抛出一个错误,导致程序进入错误处理分支。如果`asyncTask()`在规定时间内完成了,`timeout()`会返回异步操作的结果。 `timeout-as-promise` ...
Request Timeout(解决方案).md