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

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

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


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

查看所有标签

猜你喜欢:

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

鸟哥的Linux私房菜 基础学习篇(第二版)

鸟哥的Linux私房菜 基础学习篇(第二版)

鸟哥 / 人民邮电出版社 / 2007-9 / 65.00元

《鸟哥的Linux私房菜基础学习篇(第二版)》全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系统安全非常重要的Linux账号的管理......一起来看看 《鸟哥的Linux私房菜 基础学习篇(第二版)》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

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

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换