Случайные 502 за балансировщиком
Вопрос
Node-сервис за балансировщиком (keep-alive к апстриму, idle timeout балансировщика 60 с). Под небольшой нагрузкой изредка приходят 502. Какая причина наиболее вероятна?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Node не поддерживает keep-alive во входящих соединениях и рвёт их
- Event loop заблокирован, и Node сам отвечает балансировщику 502
- Балансировщик открывает слишком много соединений, Node отклоняет их
keepAliveTimeoutNode (5 с) меньше idle таймаута балансировщикаправильный ответ
Разбор
Гонка закрытия idle-соединения: Node закрывает его через keepAliveTimeout (5 секунд по умолчанию), а балансировщик считает его живым до своих 60 секунд и отправляет туда запрос ровно в момент закрытия. Получает обрыв и отдаёт клиенту 502. Ошибка редкая и плавающая, особенно при небольшой нагрузке, когда соединения часто простаивают.
Лечение: keepAliveTimeout у апстрима больше idle timeout балансировщика (например 65 с), и headersTimeout ещё чуть больше. Сам Node 502 не генерирует, это код прокси; блокировка event loop дала бы таймауты (504), а не обрывы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.