http请求超时, 底层发生了什么?
业务方反应调用接口超时,但是在服务端监控并没有看到5xx异常, 于是我们模拟一下请求超时时发生了什么?
1.openresty模拟长耗时服务端
延迟5s响应
error_log logs/error.log;
http {
server {
listen 80;
charset utf-8;
location /reqtimeout {
default_type text/html;
content_by_lua '
local start = os.clock()
while os.clock() - start < 5 do end
ngx.say("delay success!!")
';
}
}
}
2.golang和.net默认的httpclient对外都只有一个timeout设置
用于控制请求、响应的整体时间
.net httpclient 默认timeout= 100s;
golang net/http 无默认值设置,强烈推荐设置timeout,以避免服务端慢响应拖垮客户端。
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var a = HttpReqTimeout();
Console.WriteLine(a.Result);
}
static async Task<string> HttpReqTimeout()
{
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(1)
};
using (var hc = new HttpClient(handler))
{
hc.Timeout = TimeSpan.FromSeconds(3);
return await hc.GetStringAsync("http://localhost/reqtimeout");
}
}
dotnet run ./ 显示客户端请求3s超时,爆出异常
Hello, World!
Unhandled exception. System.AggregateException: One or more errors occurred. (A task was canceled.)
---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
at System.Threading.Tasks.Task.GetExceptions(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at ConsoleApp1.Program.Main(String[] args) in /Users/admin/RiderProjects/TestHttpClientFactory/ConsoleApp1/Program.cs:line 9
--- End of stack trace from previous location ---
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at ConsoleApp1.Program.Main(String[] args) in /Users/admin/RiderProjects/TestHttpClientFactory/ConsoleApp1/Program.cs:line 9
openresty服务端日志,显示执行完成,返回200ok:
127.0.0.1 - - [04/Dec/2024:15:17:50 +0800] "GET /reqtimeout HTTP/1.1" 200 28 "-" "-"
这也正是对应上了业务方的反馈和服务端的监控现象(无5xx报错)。
3.wireshark抓包看实质
tcp.port == 80 && ip.addr ==127.0.0.1 && ip.dst ==127.0.0.1
从tcp抓包过程看,分为三阶段:
1>. httpclient请求, 正常tcp三次握手+ 请求确认;
2>. 客户端3s之后超时, 客户端发送FIN+ACK 数据包(客户端标记连接已经被关闭), 服务端确认收到客户端的FIN包;
3>. 服务端5s尝试响应给客户端,最终会检测到客户端已经关闭而释放资源。
也就是说客户端请求超时,只会影响客户端, 服务端还会继续处理并响应, 这也是我们在服务端监控上看不到5xx报错的原因,可以通过在服务端设置: request_time between (-xx, 3s) 监测请求耗时占比。
正常的请求/响应读者可以参考下图:
http请求超时, 底层发生了什么?的更多相关文章
- C# Socket连接请求超时机制
作者:RazanPaul 译者:Todd Wei 原文:http://www.codeproject.com/KB/IP/TimeOutSocket.aspx 介绍 您可能注意到了,.Net的Syst ...
- HTTP 408请求超时错误解决办法
错误描述 对于大多数网站而言,我们所看到的错误消息已经是开发者定制过的页面,比如我们最常见的自定义404错误页面,一般而言,我们看到的408错误应该是类似这样的提示:“408:Request Time ...
- Java Apcahe的HTTPClient工具Http请求当请求超时重发
java Apcahe的HTTPClient工具Http请求当请求超时时底层会默认进行重发,默认重发次数为3次,在某些情况下为了防止重复的请求,需要将自动重发覆盖. 设置HTTP参数,设置不进行自动重 ...
- SQL Server 磁盘请求超时的833错误原因分析以及解决
本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的erro ...
- Feign请求报请求超时
Feign的底层基于Rabbion实现的,一般情况下直接导入feign的依赖,然后调用feignClient去发送请求,报请求超时. application.yml #hystrix的超时时间 hys ...
- 精讲响应式WebClient第5篇-请求超时设置与异常处理
本文是精讲响应式WebClient第5篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- 记一次mysql请求超时甩锅历程
今天下午业务找我说是线上环境一个mysql库很慢,请求出现了大量的超时,让帮忙看看,以下为查找过程及甩锅过程. 1. mysql请求超时,ok,我们所有线上mysql都是开启了慢查询日志的,查找慢查询 ...
- vue-resource请求超时timeout设置
请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ...
- SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...
- 已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
操作SQLServer数据库时.遇到这种问题:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 经过查找材料了解为资源抢占,照成死锁,杀死进程就OK了.详细操作 ...
随机推荐
- [C++] Rander
注 这个Rander对单个数据的平均分散不太优秀,但是获取大量数据十分平均 当前版本 2.0 for Windows 功能 int rander::reset() 按默认大小重置随机数序列,返回默认大 ...
- 《Vue.js 设计与实现》读书笔记 - 第12章、组件的实现原理
第12章.组件的实现原理 12.1 渲染组件 在渲染器内部的实现看,一个组件是一个特殊类型的虚拟 DOM 节点.之前在 patch 我们判断了 VNode 的 type 值来处理,现在来处理类型为对象 ...
- Vite2 如何设置打包后文件名
vite.config.js build: { rollupOptions: { output: { entryFileNames: `assets/[name].${timestamp}.js`, ...
- 国产OS 中标麒麟下 C# 桌面应用开发环境搭建笔记
1.中标麒麟 7.0 x86 桌面版 默认安装创建用户时,如果没勾选 root 用户使用相同的口令,那么安装完成以后,root 是没有设置口令的,通过 sudo passwd root 输入当前普通用 ...
- Diffusion系列-预备知识I -(一)
预备知识 范数 范数是一种函数,用来度量向量的大小1.在机器学习.信号处理等领域中,范数常常被用作正则化方法,通过对参数向量的范数进行约束,达到控制模型复杂度.防止过拟合等目的.常见的范数有0范数.1 ...
- Android复习(二)应用资源——>字体
字体资源定义了可在应用中使用的自定义字体.字体可以是单独的字体文件或字体文件的集合,称为字体系列,并在 XML 中定义. 另请参阅如何定义 XML 中的字体,或改用可下载字体. 捆绑式字体 您可以将字 ...
- 云原生周刊:Prometheus 3.0 Beta 发布|2024.09.16
开源项目推荐 Kuma Kuma 是一个现代化的基于 Envoy 的服务网格,能够在每个云平台上运行,支持单区域或多区域部署,兼容 Kubernetes 和虚拟机.凭借其广泛的通用工作负载支持,以及对 ...
- KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
为什么开源 KubeEye Kubernetes 作为容器编排的事实标准,虽然架构优雅功能也非常强大,但是 Kubernetes 在日常运行过程中总会有一些疑难杂症和隐性的问题让集群管理员和 Yaml ...
- KubeSphere 边缘节点 IP 冲突的分析和解决思路分享
在上一篇监控问题排查的文章中,笔者分析了 KubeSphere 3.1.0 集成 KubeEdge 中的边缘监控原理和问题排查思路,在介绍 EdgeWatcher 组件时提到了"边缘节点的内 ...
- NebulaGraph 的云产品交付实践
作者:乔雷,Vesoft.Inc 云原生技术专家 NebulaGraph 介绍 NebulaGraph 是由杭州悦数科技有限公司自主研发的一款开源分布式图数据库产品,擅长处理千亿节点万亿条边的超大数据 ...