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

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

内容简介:因为组内的错误日志被重定向另外一个日志里今天查看的时候发现一个进程有这样的输出报一个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


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

查看所有标签

猜你喜欢:

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

创业就是要细分垄断

创业就是要细分垄断

李开复、汪华、傅盛 / 文化发展出版社 / 2017-5-1 / CNY 45.00

对各方面资源极为有限的创业公司而言,想在激烈的市场竞争中站立下来的第一步是:成为细分市场的垄断者。不管是资本还是尖端人才,追逐的永远是行业里尖端的企业,第二名毫无意义。 首先,要精准定位潜在市场。这个市场的需求仍没有被满足,并且潜力巨大。其次,抓住时代和行业的红利,通过高速增长实现“小垄断”,抢滩登陆。最后,在细分领域里建立起自己的竞争壁垒,应对巨头和竞争对手的复制,去扩展更大的市场,从而扩......一起来看看 《创业就是要细分垄断》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试