Проверяет понимание важности переиспользования HTTP клиента в Go для эффективного управления соединениями и ресурсами.
В Go HTTP клиент по умолчанию использует пул соединений (connection pool), который позволяет повторно использовать TCP-соединения для нескольких запросов. Создание нового клиента для каждого запроса приводит к созданию новых горутин и сокетов, что увеличивает нагрузку на систему и замедляет выполнение.
HTTP клиент в Go управляет соединениями через транспортный слой (http.Transport). Он поддерживает пул idle-соединений, которые могут быть переиспользованы для последующих запросов к тому же хосту. Это уменьшает задержки, связанные с установкой нового TCP-соединения и TLS-рукопожатия.
// Правильно: переиспользуем клиент
client := &http.Client{
Timeout: 10 * time.Second,
}
for i := 0; i < 100; i++ {
resp, err := client.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
resp.Body.Close()
}
// Неправильно: создаем новый клиент каждый раз
for i := 0; i < 100; i++ {
client := &http.Client{}
resp, err := client.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
resp.Body.Close()
}Переиспользование HTTP клиента в Go обязательно для production-приложений, так как это снижает нагрузку на систему, уменьшает задержки и предотвращает утечку ресурсов. Всегда создавайте один клиент на уровне приложения или сервиса.