keep-alive TTL в Go Transport никогда не закрывает соединения - PullRequest
0 голосов
/ 23 января 2019

У меня есть приложение, размещенное на 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 голосов
/ 11 мая 2019

При настройке сервера вы должны добавить таймауты, соответствующие вашему приложению, например

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

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

...