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,
}

При этом должны быть отключены свободные соединения. Если это восходящий балансировщик нагрузки, отправляющий проверки работоспособности для такого количества подключений, решение будет другим.

Другие вопросы по тегам