Оптимизация производительности
Сравнение предустановок конфигурации
| Метрика | Default | Secure | Performance | Minimal |
|---|---|---|---|---|
| Таймаут Request | 180s | 15s | 60s | 180s |
| MaxIdleConns | 50 | 20 | 100 | 10 |
| MaxConnsPerHost | 10 | 5 | 20 | 2 |
| MaxRetries | 3 | 1 | 3 | 0 |
| MaxResponseBodySize | 10MB | 5MB | 50MB | 1MB |
| HTTP/2 | Вкл | Вкл | Вкл | Вкл |
| Cookies | Выкл | Выкл | Вкл | Выкл |
| Защита SSRF | Вкл | Вкл | Вкл | Вкл |
| FollowRedirects | Вкл | Выкл | Вкл | Выкл |
Выбор по сценарию
| Сценарий | Рекомендованная предустановка | Рекомендации по настройке |
|---|---|---|
| Обычные веб-сервисы | Default | - |
| Обработка URL от пользователей | Secure | - |
| Внутренние микросервисы с высокой нагрузкой | Performance | Увеличить MaxIdleConns |
| Одноразовые скрипты | Minimal | - |
| Сервис загрузки файлов | Performance | Увеличить MaxResponseBodySize |
| Финансовые/медицинские API | Secure + пользовательская | Добавить промежуточное ПО аудита |
go
// Сценарий высокой пропускной способности
client, _ := httpc.New(httpc.PerformanceConfig())
// Тонкая настройка на основе предустановки
cfg := httpc.PerformanceConfig()
cfg.Timeouts.Request = 120 * time.Second
cfg.Connection.MaxIdleConns = 200
client, _ := httpc.New(cfg)Повторное использование пула объектов
Внутри HTTPC переиспользует объекты ответов движка и построители строк через sync.Pool, снижая нагрузку на GC; Result создаётся заново для каждого запроса и утилизируется GC:
go
result, err := client.Get(url)
if err != nil {
return err
}
// Result создаётся заново для каждого запроса, утилизируется GC, ручное освобождение не требуетсяTIP
В высоконагруженных сценариях повторное использование пула объектов значительно снижает нагрузку на GC.
Антипаттерны производительности
| Антипаттерн | Причина | Правильный подход |
|---|---|---|
| Создание клиента на каждый запрос | Соединения не переиспользуются | Глобальное переиспользование клиента |
| Слишком большой MaxResponseBodySize | Высокое потребление памяти | Установите разумные ограничения |
| Использование result.String() на горячих путях | Накладные расходы на построение строки | Используйте Body() напрямую |
Что дальше
- Пул соединений и прокси — выбор параметров пула соединений, настройка прокси и DoH
- Обработка ошибок — стратегия разделения таймаутов
- Обзор безопасности — баланс безопасности и производительности