Привет!
Стандартный 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 работает именно так.