Go 是否使用http.TimeoutHandler或ReadTimeout/WriteTimeout?

Go 是否使用http.TimeoutHandler或ReadTimeout/WriteTimeout?,go,Go,如果我已经设置了ReadTimeout和WriteTimeout,那么额外使用它有意义吗?似乎这个场景是相互排斥的?这两个场景处理http请求/响应生命周期的不同方面。 http.TimeoutHandler用于限制http.Handler的执行时间。如果http.Handler没有在规定的时间内完成,它将向客户端返回503状态代码 而,ReadTimeout和WriteTimeout分别处理网络I/O超时,即向客户端读取/写入请求/响应正文所需的时间 因此,http.TimeoutHandle

如果我已经设置了ReadTimeout和WriteTimeout,那么额外使用它有意义吗?似乎这个场景是相互排斥的?

这两个场景处理http请求/响应生命周期的不同方面。

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())