keep-alive TTL в Go Transport никогда не закрывает соединения
У меня есть приложение, размещенное на 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. Итак, в чем может быть проблема
0 ответов
Когда вы настраиваете свой сервер, вы должны добавить таймауты, подходящие для вашего приложения, например
srv := &http.Server{
ReadTimeout: 5 * time.Second,
WriteTimeout: 20 * time.Second,
IdleTimeout: 180 * time.Second,
Handler: myMux,
}
При этом должны быть отключены свободные соединения. Если это восходящий балансировщик нагрузки, отправляющий проверки работоспособности для такого количества подключений, решение будет другим.