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'ах.
  • Мониторинг открытых сокетов под нагрузкой.