Выбор ответа Senior HTTP-сервер, Express, NestJS обновлено

Случайные 502 за балансировщиком

Вопрос

Node-сервис за балансировщиком (keep-alive к апстриму, idle timeout балансировщика 60 с). Под небольшой нагрузкой изредка приходят 502. Какая причина наиболее вероятна?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: keepAliveTimeout Node (5 с) меньше idle таймаута балансировщика. Гонка закрытия idle-соединения: Node закрывает его через keepAliveTimeout (5 секунд по умолчанию), а балансировщик считает его живым до своих 60 секунд и отправляет туда запрос ровно в момент закрытия.

Варианты ответа

  1. Node не поддерживает keep-alive во входящих соединениях и рвёт их
  2. Event loop заблокирован, и Node сам отвечает балансировщику 502
  3. Балансировщик открывает слишком много соединений, Node отклоняет их
  4. keepAliveTimeout Node (5 с) меньше idle таймаута балансировщикаправильный ответ

Разбор

Гонка закрытия idle-соединения: Node закрывает его через keepAliveTimeout (5 секунд по умолчанию), а балансировщик считает его живым до своих 60 секунд и отправляет туда запрос ровно в момент закрытия. Получает обрыв и отдаёт клиенту 502. Ошибка редкая и плавающая, особенно при небольшой нагрузке, когда соединения часто простаивают.

Лечение: keepAliveTimeout у апстрима больше idle timeout балансировщика (например 65 с), и headersTimeout ещё чуть больше. Сам Node 502 не генерирует, это код прокси; блокировка event loop дала бы таймауты (504), а не обрывы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.