intermediate
Keep-alive и connection reuse
Объясняйте persistent connections, agent pools, idle timeouts, socket exhaustion, upstream resets и почему reuse влияет на latency.
Постоянные HTTP-соединения распределяют стоимость TCP и TLS handshake на несколько запросов. `http.Agent` в Node пулит сокеты с `keepAlive: true` в современных версиях — важно для сервисов с множеством вызовов upstream API.
import { Agent, request } from 'node:https';
const agent = new Agent({ keepAlive: true, maxSockets: 50, timeout: 30_000 });
request('https://api.example.com/data', { agent }, (res) => { /* ... */ });
Idle timeouts на load balancers, NAT и upstream могут тихо закрыть соединение — следующий запрос упадёт и откроет новый сокет. Исчерпание сокетов при низком `maxSockets` или утечках соединений.
На интервью: почему reuse улучшает P99 latency; выравнивание idle timeouts client < LB < server; `ECONNRESET` после простоя.
Типовые ошибки: новый Agent на каждый запрос; несогласованный keep-alive между proxy и app; half-open при deploy.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Pooled agents для исходящего HTTP.
- maxSockets под concurrency.
- Согласованные timeouts на всех hop'ах.
- Мониторинг открытых сокетов под нагрузкой.