Go 是否使用http.TimeoutHandler或ReadTimeout/WriteTimeout?
如果我已经设置了ReadTimeout和WriteTimeout,那么额外使用它有意义吗?似乎这个场景是相互排斥的?这两个场景处理http请求/响应生命周期的不同方面。Go 是否使用http.TimeoutHandler或ReadTimeout/WriteTimeout?,go,Go,如果我已经设置了ReadTimeout和WriteTimeout,那么额外使用它有意义吗?似乎这个场景是相互排斥的?这两个场景处理http请求/响应生命周期的不同方面。 http.TimeoutHandler用于限制http.Handler的执行时间。如果http.Handler没有在规定的时间内完成,它将向客户端返回503状态代码 而,ReadTimeout和WriteTimeout分别处理网络I/O超时,即向客户端读取/写入请求/响应正文所需的时间 因此,http.TimeoutHandle
http.TimeoutHandler
用于限制http.Handler的执行时间。如果http.Handler
没有在规定的时间内完成,它将向客户端返回503
状态代码
而,ReadTimeout
和WriteTimeout
分别处理网络I/O超时,即向客户端读取/写入请求/响应正文所需的时间
因此,
http.TimeoutHandler
通过包装原始处理程序,处理处理程序(处理http请求的代码块)需要在设定时间内完成的情况。而http.WriteTimeout
或http.ReadTimeout
则用于您不想无限期等待请求/响应的网络读/写。这篇博客文章很好地解释了这一点,但本质上它们扮演的角色略有不同,如下所示:
您还没有包括您的用例是什么,但希望这些信息足以让您做出决定。如果您要赤裸裸(直接)公开您的应用程序,前面没有HAproxy/Nginx,更改默认值可能会有所帮助,例如(根据您的要求对其进行微调):
//配置服务器
srv:=&http.Server{
地址:“:8080”,
处理程序:路由器,
读取超时:5*次。秒,
WriteTimeout:7*次。秒,
MaxHeaderBytes:1这两个完全不相关。因此您可以同时使用这两个。另请参阅:感谢您的评论。根据@Zak的评论和图表判断,http.TimeoutHandler
应该包含在http.Server.WriteTimeout
中。这有意义吗?@mattes,No,TimeoutHandler
处理您的处理程序(处理http请求的代码块)需要在设定的时间内完成,而当您不想无限期地等待网络写入时,则使用WriteTimeout
。@desaiparth hi,我正在使用http.TimeoutHandler
,在返回状态503
后,处理程序(处理http请求的代码块)仍在执行。我如何终止处理程序的执行?谢谢。我读了这篇博文。我想补充一点,最终提供一个自定义的TCPListener
,以及将3分钟默认的KeepAlive超时覆盖为更短的时间似乎很重要。来源:如果你使用ReadTimeout
=5s,你如何上传大文件到服务器?例如,你需要上传10mb的图像文件,需要30秒。因此它无法提供服务?@TomSawyer查看此帖子/要点,它可以给你一些想法,比如banks@Zak!用例是限制http.Handler
可以运行的时间。如果我设置http.server.R,似乎我不必设置http.TimeoutHandler
eadTimeout
和http.Server.WriteTimeout
相反。你同意吗?是的,我同意在服务器上设置读写超时很重要。如果代码很容易包含,我可以看到一个论点,说明通过使用http.TimeoutHandler
来强制执行此情况,可以增加灵活性和控制。但正如alread所说的我已经讨论过了,我认为如果你在其他地方有超时,这并不是绝对必要的。我认为服务器超时是为了防御无响应的客户端,httpTimeoutHandler
是为了防御缓慢的处理程序。在你的情况下,我认为你担心缓慢的处理程序?这现在很有意义。感谢cleari消除混乱。
// configure server
srv := &http.Server{
Addr: ":8080",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 7 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(srv.ListenAndServe())