golang 使用http 客户端 以及 服务端需要注意的Timeout问题

栏目: Go · 发布时间: 5年前

内容简介:因为组内的错误日志被重定向另外一个日志里今天查看的时候发现一个进程有这样的输出报一个IO WAIT  然后我查了一下一开始我搞错方向了以为是http 客户端的问题 查看了代码使用原生的http.Post() 函数很容易忽略一个问题 就是http.Post()  http.Get()使用的DefaultClient 这个对象而这个对象如果你没有显式的对DefaultClient 的成员Timeout 赋值那么这个请求是没有设置超时时间的,将不会超时,使协程挂掉解决这个问题简单一点的就是直接设置http.Cl

因为组内的错误日志被重定向另外一个日志里今天查看的时候发现一个进程有这样的输出

golang 使用http 客户端 以及 服务端需要注意的Timeout问题

报一个IO WAIT  然后我查了一下一开始我搞错方向了以为是http 客户端的问题 查看了代码使用原生的http.Post() 函数很容易忽略一个问题 就是http.Post()  http.Get()使用的DefaultClient 这个对象而这个对象如果你没有显式的对DefaultClient 的成员Timeout 赋值那么这个请求是没有设置超时时间的,将不会超时,使协程挂掉

golang 使用http 客户端 以及 服务端需要注意的Timeout问题
golang 使用http 客户端 以及 服务端需要注意的Timeout问题
golang 使用http 客户端 以及 服务端需要注意的Timeout问题

已经被用烂了的图

解决这个问题简单一点的就是直接设置http.Clinet.Timeout,如果想更小粒度的控制

net.Dialer.Timeout:限制建立TCP连接所花费的时间

http.Transport.TLSHandshakeTimeout :限制了执行TLS握手的时间

http.Transport.ResponseHeaderTimeout:限制了读取头部的时间

http.Transport.ExpectContinueTimeout :这个设置在1.6被去掉

http.Transport.IdleConnTimeout:在连接池中限制一个空闲连接的保持时间

对于发送request的时间并没有任何方法可以限制但是可以取消这个quest

*****************************************************************************************************************************************************************

回到IO WAIT 的问题 可以看到 栈是从底层的http.server 函数打上来的不是客户端未超时造成的 为什么会有这个问题我查了下 http server 是有一个ReadTimeout 和 WriteTimeout 的参数,这两个参数是做什么的呢?

如果不设置Timeout,那么很慢的客户端或者消失的客户端就会影响到服务端,将会看到如下的表示

golang 使用http 客户端 以及 服务端需要注意的Timeout问题
golang 使用http 客户端 以及 服务端需要注意的Timeout问题

still已经被用烂了的图

从图上看ReadTimeout 就是从建立连接到获取请求头部和body(如果有body的话)的时间,WriteTimeout 就是覆盖从读取头部结束到写回response的时间,如果你使用了https的话那么 他从结束accept就开始调用SetWriteDeadline,那么在这种情况下也包括了header read and the first byte wait这部分内容,就是上图虚线那部分时间

http.TimeoutHandler 并不是一个服务端参数,只是handler的一个封装,可以限制http处理请求的最长时间,他通过超过时间将返回504,如果不设置超时时间可以使用这个来处理请求

使用默认的http.Server 以及函数 http.ListenAndServe, http.ListenAndServeTLS 这些函数的timeout 默认值都是关闭了timeout,有链接泄露和文件描述符用光的危险

参考

The complete guide to Go net/http timeouts


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

思考的乐趣

思考的乐趣

顾森 / 人民邮电出版社 / 2012-6 / 45.00元

本书是一个疯狂数学爱好者的数学笔记,面向所有喜爱数学的读者。从2005年7月开始,作者已经写了连续六年的博客,积累下来了大量的数学文章。 部分文章内容被广泛关注,在网络上大量分享转载。 这本书有意挑选了初等的话题,让大大小小的读者都能没有障碍地阅读。文章内容新,让有数学背景的人也会发现很多自己没见过的初等问题。 文章是独立的。一篇文章一个话题,文章与文章之间基本不会做参考,读者可以随意跳着看......一起来看看 《思考的乐趣》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具