Масштабирование Node.js под нагрузкой дает сбой, когда сервис считает каждый запрос легким, а каждый повтор безобидным. JavaScript по умолчанию выполняется через один основной цикл событий. Если запрос запускает тяжелую синхронную работу, цикл не может быстро обслуживать остальных клиентов. Во время рекламной кампании задержки растут, тайм-ауты вызывают повторы, а повторный трафик становится больше исходного спроса.
Официальное руководство Node.js о недопустимости блокировки цикла событий объясняет разделение работы между циклом событий и пулом работников. Рекомендации AWS по экспоненциальной задержке и случайному разбросу показывают, как синхронные повторы создают конкуренцию. Обе меры решают одну задачу: защищают ограниченную мощность и управляют повторным спросом.
Найдите работу, которая блокирует общую мощность
Профилируйте путь запроса до запуска кампании. Ищите синхронный разбор больших данных, преобразования, сжатие, шифрование, обработку изображений, создание отчетов, сложную проверку и циклы, стоимость которых растет с входом. Операция на 100 единиц работы в небольшом тесте становится общей проблемой, когда одновременно приходят 10,000 клиентов.
Так возникает каскадная зависимость. Один медленный компонент увеличивает очереди выше по цепочке. Клиенты получают тайм-аут и повторяют запрос. Следующие сервисы принимают дубликаты. Оператор может добавить мощность не на том уровне, потому что первый видимый симптом не совпадает с исходной причиной.
Тяжелую работу нужно вывести из общего цикла событий. Потоки работников, отдельные процессы, выделенные обработчики очереди или другой сервис изолируют вычисления. Выбор зависит от объема, передачи данных, поведения при ошибке и развертывания. Изоляция должна уменьшать область отказа, а не прятать прежнее узкое место за новой очередью.
Отказоустойчивая высоконагруженная инфраструктура строится из нескольких независимых границ. Если один работник замедлился, остальные должны сохранять основной путь. Для этого нужны отдельные очереди, лимиты и проверка здоровья каждого экземпляра.
Управляйте входом и повторными запросами
Обратное давление сообщает клиентам и внутренним производителям, что система не может безопасно принять больше работы. Используйте ограниченные очереди, предел параллельности и размера запроса, тайм-ауты, явный отказ или упрощение функции. Честный временный отказ безопаснее принятой задачи, которую нельзя завершить в срок.
У повторов должен быть бюджет. Ограничьте число попыток, применяйте экспоненциальную задержку, добавляйте случайный разброс и не повторяйте постоянные ошибки. Передавайте ключ идемпотентности там, где повторное выполнение создает дубли заказов, сообщений или платежей.
Стоимость простоя объясняет, почему контроль перегрузки является деловой мерой. Непредсказуемое падение основного пути может стоить дороже, чем временное отключение второстепенной функции.
Прогрейте мощность и подготовьте управление
Увеличьте и прогрейте мощность до кампании. Убедитесь, что несколько работников или контейнеров действительно получают трафик и достигают зависимостей. Проверьте задержку автомасштабирования, пулы соединений, кэш, потребителей очереди и внешние ограничения. Мощность, которая появляется слишком поздно, не примет первую волну.
Наблюдайте задержку цикла событий, время ответа, ошибки, глубину очереди, загрузку работников, память, перезапуски, зависимости и объем повторов. Оповещайте по форме отказа, а не только по общему трафику. Растущая очередь при стабильном входе показывает заблокированный обработчик до полной аварии.
Подготовьте аварийный выключатель для тяжелых функций и необязательных фоновых задач. Заранее решите, какую часть сервиса можно упростить, сохранив основную транзакцию. Рекламный трафик может останавливаться часами, поэтому приложение нуждается в собственном управлении.
Практика аварийного восстановления полезна и для всплеска нагрузки. Ответственные, сигналы, порядок действий и возврат к нормальному режиму определяются до инцидента.
Отдельно проверьте внешние зависимости. Платежный шлюз, база данных или сторонний интерфейс могут иметь более жесткий предел, чем приложение. Локальное добавление работников только быстрее заполнит удаленную очередь. Согласуйте пределы, кэширование, повторное использование ответа и режим упрощения заранее. Тогда масштабирование защищает полный путь запроса, а не только процесс Node.js.
После кампании разберите графики и действия операторов. Зафиксируйте ранние сигналы, полезные ограничения и решения, которые создали лишнюю нагрузку.
Цель не состоит в бесконечной мощности. Сервис должен сохранять основной путь, предсказуемо отказывать лишней работе и восстанавливаться без нового шторма повторов.
Частые вопросы
JavaScript обычно работает в одном основном цикле событий. Тяжелая синхронная операция мешает циклу быстро обслуживать других клиентов и повышает задержку.
После тайм-аута клиент повторяет запрос, хотя исходная работа может продолжаться. Без лимита, задержки и разброса повторы синхронно умножают нагрузку.
Нужны ограниченные очереди, пределы параллельности, изоляция работников, бюджет повторов, идемпотентность, прогретая мощность и аварийный выключатель.
Измеряйте задержку цикла событий, время ответа, ошибки, глубину очереди, загрузку работников, память, перезапуски, зависимости и объем повторов.
Перед запуском кампании закажите у компании Открытый путь бесплатный технический аудит инфраструктуры. Он выявит блокирующий код, риск повторов, задержку масштабирования и отсутствующие средства управления.
