@memba

Как работает KeepAlive в net.Dialer?

Привет!

Стандартный http.Client в Go выглядит примерно таким образом:

http.Client{
	Transport: &http.Transport{
		Dial: (&net.Dialer{
			Timeout:   30 * time.Second,
			KeepAlive: 30 * time.Second,
			DualStack: true,
		}).DialContext,
	MaxIdleConns:          100,
	IdleConnTimeout:       90 * time.Second,
	TLSHandshakeTimeout:   10 * time.Second,
	ExpectContinueTimeout: 1 * time.Second,
	},
}


Как я понимаю:
MaxIdleConns - максимальное кол-во соединений, которое может находится в пуле свободных соединений для ВСЕХ хостов.
IdleConnTimeout - максимальное время которое незанятые соединения могут храниться в пуле.

Ещё есть
MaxIdleConnsPerHost - который по умолчанию равен DefaultMaxIdleConnsPerHost... т.е. 2
Значит если я устанавливаю 10 соединений с одним хостом, то в пуле MaxIdleConns будет храниться только 2 свободных соединения... а не 100.

А ещё есть KeepAlive: 30 сек. Как он взаимодействует с IdleConnTimeout?
Если я установлю соединение, сделаю запрос, далее оно упадет в пул. Так оно умрет через 30сек или через 90сек, как указано в IdleConnTimeout? А если на запрос потребовалось 15 сек, далее соединение упало в пул, полежало там 25 сек и я опять делаю запрос на 15 сек. Соединение умрет во время запроса? Просто Client.Timeout работает именно так.
  • Вопрос задан
  • 492 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы