Go Transport中的keep-alive TTL永远不会关闭连接

时间:2019-01-23 15:02:03

标签: go tcp httpserver keep-alive aws-alb

我有一个托管在AWS上的应用程序,该应用程序在Production上运行,并创建一个http服务器,如以下示例代码中所述。 Go库中的默认超时为180秒。因此,理想情况下,不使用的连接应在180秒后关闭。

myMux := http.NewServeMux()
myMux.Handle("/SOME_PATH", appHandler{myHandler})
err = http.ListenAndServe(viper.GetString("handler.port"), myMux)

问题是,当应用程序上的流量增加时,连接数也会增加。但是当流量下降时,连接数保持不变。

我正在使用go version go1.10 linux/amd64,并且此应用程序位于Amazon ALB后面。

已编辑的问题:

如您所见,当应用程序落后于ALB时,连接减少的速度非常慢。那么,可能是什么问题 enter image description here

1 个答案:

答案 0 :(得分:0)

设置服务器时,应添加适合您的应用程序的超时时间,例如

srv := &http.Server{
    ReadTimeout:  5 * time.Second,
    WriteTimeout: 20 * time.Second,
    IdleTimeout:  180 * time.Second,
    Handler:      myMux,
}

通过这种方式,空闲连接应该被关闭。如果是上游负载平衡器对那么多连接发送运行状况检查,则解决方案将有所不同。