Как оптимизировать производственную инфраструктуру Node.js: лучшие практики

Руководство по оптимизации производительности Node.js

Предисловие

В Forward Email мы потратили годы на совершенствование нашей среды продакшн для Node.js. Это подробное руководство делится проверенными на практике лучшими методами развертывания Node.js в продакшн, с акцентом на оптимизацию производительности, мониторинг и уроки, которые мы извлекли при масштабировании приложений Node.js для обработки миллионов транзакций в день.

Наша революция оптимизации производительности одного ядра на 573%

Когда мы перешли с процессоров Intel на AMD Ryzen, мы достигли улучшения производительности на 573% в наших приложениях Node.js. Это была не просто незначительная оптимизация — она фундаментально изменила производительность наших приложений Node.js в продакшн и демонстрирует важность оптимизации производительности одного ядра для любого приложения Node.js.

Tip

Для лучших практик развертывания Node.js в продакшн выбор оборудования критичен. Мы специально выбрали хостинг DataPacket из-за доступности AMD Ryzen, поскольку производительность одного ядра крайне важна для приложений Node.js, так как выполнение JavaScript однопоточное.

Почему оптимизация производительности одного ядра важна для Node.js

Наш переход с Intel на AMD Ryzen привел к:

  • улучшению производительности на 573% при обработке запросов (задокументировано в GitHub Issue #1519 на нашей странице статуса)
  • исчезновению задержек обработки до почти мгновенных ответов (упомянуто в GitHub Issue #298)
  • лучшему соотношению цена-производительность для продакшн-сред Node.js
  • улучшению времени отклика на всех конечных точках нашего приложения

Увеличение производительности было настолько значительным, что теперь мы считаем процессоры AMD Ryzen обязательными для любого серьезного продакшн-развертывания Node.js, будь то веб-приложения, API, микросервисы или любая другая нагрузка Node.js.

Для получения дополнительной информации о наших инфраструктурных решениях ознакомьтесь с:

Настройка продакшн-среды Node.js: наш технологический стек

Наши лучшие практики развертывания Node.js в продакшн включают осознанный выбор технологий, основанный на многолетнем опыте работы в продакшн. Вот что мы используем и почему эти решения применимы к любому приложению Node.js:

Менеджер пакетов: pnpm для эффективности в продакшн

Что мы используем: pnpm (фиксированная версия)

Мы выбрали pnpm вместо npm и yarn для настройки продакшн-среды Node.js, потому что:

  • Быстрее установка в CI/CD пайплайнах
  • Экономия дискового пространства за счет жестких ссылок
  • Строгая резолюция зависимостей, предотвращающая фантомные зависимости
  • Лучшая производительность при развертывании в продакшн

Note

В рамках наших лучших практик развертывания Node.js в продакшн мы фиксируем точные версии критически важных инструментов, таких как pnpm, чтобы обеспечить согласованное поведение во всех средах и на машинах членов команды.

Детали реализации:

Веб-фреймворк: Koa для современного продакшна Node.js

Что мы используем:

  • @koa/router
  • @koa/multer
  • @ladjs/koa-simple-ratelimit Мы выбрали Koa вместо Express для нашей производственной инфраструктуры на Node.js из-за его современной поддержки async/await и более чистой композиции middleware. Наш основатель Ник Боу (Nick Baugh) внес вклад в разработку как Express, так и Koa, что дало нам глубокое понимание обеих платформ для использования в продакшене.

Эти шаблоны применимы независимо от того, строите ли вы REST API, GraphQL серверы, веб-приложения или микросервисы.

Наши примеры реализации:

Обработка фоновых задач: Bree для надежности в продакшене

Что мы используем: планировщик bree

Мы создали и поддерживаем Bree, потому что существующие планировщики задач не удовлетворяли наши потребности в поддержке worker threads и современных возможностей JavaScript в продакшн-средах Node.js. Это применимо к любому приложению на Node.js, которому нужна фоновая обработка, запланированные задачи или worker threads.

Наши примеры реализации:

Обработка ошибок: @hapi/boom для надежности в продакшене

Что мы используем: @hapi/boom

Мы используем @hapi/boom для структурированных ответов с ошибками во всех наших продакшн-приложениях на Node.js. Этот подход подходит для любого приложения на Node.js, которому нужна единообразная обработка ошибок.

Наши примеры реализации:

Как мониторить приложения Node.js в продакшене

Наш подход к мониторингу приложений Node.js в продакшене развивался на протяжении многих лет эксплуатации приложений в масштабе. Мы реализуем мониторинг на нескольких уровнях, чтобы обеспечить надежность и производительность для любого типа приложений на Node.js.

Системный мониторинг Node.js в продакшене

Наша основная реализация: helpers/monitor-server.js

Что мы используем: node-os-utils

Наши пороги мониторинга в продакшене (из нашего реального продакшн-кода):

  • Лимит кучи 2 ГБ с автоматическими оповещениями
  • Порог предупреждения при использовании памяти 25%
  • Порог оповещения при использовании CPU 80%
  • Порог предупреждения при использовании диска 75%

Warning

Эти пороги подходят для нашей конкретной аппаратной конфигурации. При реализации мониторинга Node.js в продакшене ознакомьтесь с реализацией monitor-server.js, чтобы понять точную логику и адаптировать значения под вашу среду.

Мониторинг на уровне приложений для Node.js в продакшене

Наша классификация ошибок: helpers/is-code-bug.js

Этот хелпер различает:

  • Реальные ошибки кода, требующие немедленного внимания
  • Ошибки пользователя, которые являются ожидаемым поведением
  • Сбои внешних сервисов, которые мы не можем контролировать

Этот шаблон применим к любому приложению на Node.js — веб-приложениям, API, микросервисам или фоновым сервисам. Наша реализация логирования: helpers/logger.js

Мы реализуем комплексное скрытие полей для защиты конфиденциальной информации, при этом сохраняя полезные возможности отладки в нашей производственной среде Node.js.

Мониторинг, специфичный для приложения

Наши серверные реализации:

Мониторинг очереди: Мы устанавливаем лимиты очереди в 5 ГБ и тайм-ауты обработки запросов в 180 секунд, чтобы предотвратить исчерпание ресурсов. Эти шаблоны применимы к любому приложению Node.js с очередями или фоновыми процессами.

Мониторинг Node.js в продакшене с помощью PM2 Health Checks

Мы усовершенствовали нашу настройку продакшен-среды Node.js с PM2 на основе многолетнего опыта эксплуатации. Наши проверки состояния PM2 необходимы для поддержания надежности любого приложения Node.js.

Наша система проверки состояния PM2

Наша основная реализация: jobs/check-pm2.js

Наш мониторинг Node.js в продакшене с помощью PM2 Health Checks включает:

  • Запускается каждые 20 минут по расписанию cron
  • Требует минимум 15 минут безотказной работы перед признанием процесса здоровым
  • Проверяет статус процесса и использование памяти
  • Автоматически перезапускает сбойные процессы
  • Предотвращает циклы перезапуска с помощью интеллектуальной проверки состояния

Caution

Для лучших практик развертывания Node.js в продакшене мы требуем 15+ минут безотказной работы перед признанием процесса здоровым, чтобы избежать циклов перезапуска. Это предотвращает каскадные сбои, когда процессы испытывают проблемы с памятью или другими ресурсами.

Наша продакшен-конфигурация PM2

Наша настройка экосистемы: Изучите наши файлы запуска серверов для настройки продакшен-среды Node.js:

Эти шаблоны применимы независимо от того, запускаете ли вы приложения Express, серверы Koa, GraphQL API или любое другое приложение Node.js.

Автоматизированное развертывание PM2

Развертывание PM2: ansible/playbooks/node.yml

Мы автоматизируем всю нашу настройку PM2 с помощью Ansible, чтобы обеспечить единообразные развертывания Node.js в продакшене на всех наших серверах.

Система обработки и классификации ошибок в продакшене

Одна из наших самых ценных лучших практик развертывания Node.js в продакшене — интеллектуальная классификация ошибок, применимая к любому приложению Node.js:

Наша реализация isCodeBug для продакшена

Исходник: helpers/is-code-bug.js

Этот помощник обеспечивает интеллектуальную классификацию ошибок для приложений Node.js в продакшене, чтобы:

  • Приоритизировать реальные баги над ошибками пользователей
  • Улучшить реакцию на инциденты, сосредотачиваясь на реальных проблемах
  • Снизить усталость от оповещений из-за ожидаемых ошибок пользователей
  • Лучше понимать проблемы приложения и ошибки, вызванные пользователями

Этот шаблон работает для любого приложения Node.js — будь то сайты электронной коммерции, SaaS-платформы, API или микросервисы.

Интеграция с нашим продакшен-логированием

Интеграция с логгером: helpers/logger.js Наш логгер использует isCodeBug для определения уровней оповещений и редактирования полей, что позволяет нам получать уведомления о реальных проблемах, фильтруя шум в нашей производственной среде Node.js.

Узнайте больше о наших шаблонах обработки ошибок:

Продвинутая отладка производительности с v8-profiler-next и cpupro

Мы используем продвинутые инструменты профилирования для анализа снимков кучи и отладки проблем с OOM (Out of Memory), узких мест производительности и проблем с памятью Node.js в нашей производственной среде. Эти инструменты необходимы для любого приложения Node.js, испытывающего утечки памяти или проблемы с производительностью.

Наш подход к профилированию для Node.js в продакшене

Рекомендуемые инструменты:

  • v8-profiler-next - Для создания снимков кучи и профилей CPU
  • cpupro - Для анализа профилей CPU и снимков кучи

Tip

Мы используем v8-profiler-next и cpupro вместе, чтобы создать полный рабочий процесс отладки производительности для наших приложений Node.js. Эта комбинация помогает выявлять утечки памяти, узкие места производительности и оптимизировать наш производственный код.

Как мы реализуем анализ снимков кучи

Наша реализация мониторинга: helpers/monitor-server.js

Наш производственный мониторинг включает автоматическое создание снимков кучи при превышении порогов памяти. Это помогает нам отлаживать проблемы OOM до того, как они вызовут сбои приложения.

Ключевые шаблоны реализации:

  • Автоматические снимки при превышении порога размера кучи в 2 ГБ
  • Профилирование по сигналу для анализа по запросу в продакшене
  • Политики хранения для управления хранением снимков
  • Интеграция с нашими задачами очистки для автоматического обслуживания

Рабочий процесс отладки производительности

Изучите нашу реальную реализацию:

Для анализа снимков кучи:

  1. Установите v8-profiler-next для создания снимков
  2. Используйте cpupro для анализа созданных снимков
  3. Реализуйте пороги мониторинга, аналогичные monitor-server.js
  4. Настройте автоматическую очистку для управления хранением снимков
  5. Создайте обработчики сигналов для профилирования по запросу в продакшене

Для профилирования CPU:

  1. Создавайте профили CPU в периоды высокой нагрузки
  2. Анализируйте с помощью cpupro для выявления узких мест
  3. Сосредоточьтесь на горячих путях и возможностях оптимизации
  4. Отслеживайте производительность до и после улучшений

Warning

Создание снимков кучи и профилей CPU может влиять на производительность. Мы рекомендуем реализовать ограничение частоты и включать профилирование только при расследовании конкретных проблем или во время окон обслуживания.

Интеграция с нашим производственным мониторингом

Наши инструменты профилирования интегрируются с нашей более широкой стратегией мониторинга:

  • Автоматический запуск на основе порогов памяти/CPU
  • Интеграция оповещений при обнаружении проблем с производительностью
  • Исторический анализ для отслеживания тенденций производительности со временем
  • Корреляция с метриками приложения для комплексной отладки Этот подход помог нам выявлять и устранять утечки памяти, оптимизировать горячие участки кода и поддерживать стабильную производительность в нашей производственной среде Node.js.

Безопасность производственной инфраструктуры Node.js

Мы реализуем комплексную безопасность для нашей производственной инфраструктуры Node.js с помощью автоматизации Ansible. Эти практики применимы к любому приложению Node.js:

Безопасность на уровне системы для производственной среды Node.js

Наша реализация Ansible: ansible/playbooks/security.yml

Наши ключевые меры безопасности для производственных сред Node.js:

  • Отключен swap для предотвращения записи конфиденциальных данных на диск
  • Отключены дампы памяти (core dumps) для предотвращения утечки памяти с конфиденциальной информацией
  • Заблокировано использование USB-накопителей для предотвращения несанкционированного доступа к данным
  • Настройка параметров ядра для обеспечения безопасности и производительности

Warning

При внедрении лучших практик развертывания Node.js в производственной среде отключение swap может привести к завершению процессов из-за нехватки памяти, если ваше приложение превысит доступный объем ОЗУ. Мы внимательно контролируем использование памяти и правильно подбираем размеры серверов.

Безопасность приложений для Node.js

Наше скрытие полей в логах: helpers/logger.js

Мы скрываем конфиденциальные поля в логах, включая пароли, токены, API-ключи и личную информацию. Это защищает конфиденциальность пользователей, сохраняя при этом возможности отладки в любой производственной среде Node.js.

Автоматизация безопасности инфраструктуры

Наш полный набор Ansible для производственной среды Node.js:

Наш контент по безопасности

Узнайте больше о нашем подходе к безопасности:

Архитектура базы данных для приложений Node.js

Мы используем гибридный подход к базам данных, оптимизированный для наших приложений Node.js. Эти шаблоны могут быть адаптированы для любого приложения Node.js:

Реализация SQLite для производственной среды Node.js

Что мы используем:

Наша конфигурация: ansible/playbooks/sqlite.yml

Мы используем SQLite для данных, специфичных для пользователя, в наших приложениях Node.js, потому что это обеспечивает:

  • Изоляцию данных для каждого пользователя/арендатора
  • Лучшую производительность для запросов одного пользователя
  • Упрощенное резервное копирование и миграцию
  • Снижение сложности по сравнению с общими базами данных

Этот шаблон хорошо подходит для SaaS-приложений, многопользовательских систем или любого приложения Node.js, которому нужна изоляция данных.

Реализация MongoDB для производственной среды Node.js

Что мы используем:

Наша конфигурация: config/mongoose.js

Мы используем MongoDB для данных приложения в нашей производственной среде Node.js, потому что она обеспечивает:

  • Гибкую схему для эволюционирующих структур данных
  • Лучшую производительность для сложных запросов
  • Возможности горизонтального масштабирования
  • Богатый язык запросов

Note

Наш гибридный подход оптимизирован под наши конкретные задачи. Изучите наши реальные шаблоны использования базы данных в кодовой базе, чтобы понять, подходит ли этот подход для вашего приложения на Node.js.

Обработка фоновых задач в Node.js в производственной среде

Мы построили архитектуру фоновых задач на основе Bree для надежного развертывания Node.js в производственной среде. Это применимо к любому приложению Node.js, которому нужна фоновая обработка:

Наша настройка сервера Bree для продакшена

Наша основная реализация: bree.js

Наше развертывание Ansible: ansible/playbooks/bree.yml

Примеры производственных задач

Мониторинг состояния: jobs/check-pm2.js

Автоматизация очистки: jobs/cleanup-tmp.js

Все наши задачи: Просмотреть полный каталог задач

Эти шаблоны применимы к любому приложению Node.js, которому нужны:

  • Запланированные задачи (обработка данных, отчеты, очистка)
  • Фоновая обработка (изменение размера изображений, отправка писем, импорт данных)
  • Мониторинг состояния и обслуживание
  • Использование рабочих потоков для задач с высокой нагрузкой на ЦП

Наши шаблоны планирования задач для Node.js в продакшене

Изучите наши реальные шаблоны планирования задач в каталоге jobs, чтобы понять:

  • Как мы реализуем планирование, похожее на cron, в Node.js в продакшене
  • Нашу обработку ошибок и логику повторных попыток
  • Как мы используем рабочие потоки для задач с высокой нагрузкой на ЦП

Автоматизированное обслуживание для производственных приложений Node.js

Мы реализуем проактивное обслуживание, чтобы предотвратить распространенные проблемы в продакшене Node.js. Эти шаблоны применимы к любому приложению Node.js:

Наша реализация очистки

Исходник: jobs/cleanup-tmp.js

Наше автоматизированное обслуживание для производственных приложений Node.js нацелено на:

  • Временные файлы, старше 24 часов
  • Файлы журналов за пределами срока хранения
  • Файлы кэша и временные данные
  • Загруженные файлы, которые больше не нужны
  • Снимки кучи для отладки производительности

Эти шаблоны применимы к любому приложению Node.js, которое генерирует временные файлы, логи или кэшированные данные.

Управление дисковым пространством для Node.js в продакшене

Наши пороги мониторинга: helpers/monitor-server.js

  • Лимиты очереди для фоновой обработки
  • Предупреждение при использовании диска 75%
  • Автоматическая очистка при превышении порогов

Автоматизация обслуживания инфраструктуры

Наша автоматизация Ansible для Node.js в продакшене:

Руководство по реализации развертывания Node.js в продакшене

Изучите наш реальный код для лучших практик продакшена

Начните с этих ключевых файлов для настройки продакшен-среды Node.js:

  1. Конфигурация: config/index.js
  2. Мониторинг: helpers/monitor-server.js
  3. Обработка ошибок: helpers/is-code-bug.js
  4. Логирование: helpers/logger.js
  5. Здоровье процесса: jobs/check-pm2.js

Учитесь на наших блог-постах

Наши технические руководства по реализации для продакшена Node.js:

Автоматизация инфраструктуры для продакшена Node.js

Наши Ansible playbooks для изучения развертывания продакшена Node.js:

Наши кейс-стади

Наши корпоративные реализации:

Заключение: лучшие практики развертывания продакшена Node.js

Наша продакшен-инфраструктура Node.js демонстрирует, что приложения Node.js могут достигать корпоративного уровня надежности благодаря:

  • Проверенным аппаратным решениям (AMD Ryzen для оптимизации производительности одного ядра на 573%)
  • Отлаженному мониторингу продакшена Node.js с конкретными порогами и автоматическими реакциями
  • Умной классификации ошибок для улучшения реагирования на инциденты в продакшен-средах
  • Продвинутой отладке производительности с помощью v8-profiler-next и cpupro для предотвращения OOM
  • Комплексному усилению безопасности через автоматизацию Ansible
  • Гибридной архитектуре базы данных, оптимизированной под нужды приложения
  • Автоматизированному обслуживанию для предотвращения распространенных проблем продакшена Node.js

Главный вывод: изучайте наши реальные файлы реализации и блог-посты, а не следуйте общим рекомендациям. Наш код предоставляет реальные шаблоны для развертывания продакшена Node.js, которые можно адаптировать для любых приложений Node.js — веб-приложений, API, микросервисов или фоновых сервисов.

Полный список ресурсов для продакшена Node.js

Наши основные файлы реализации

Наши серверные реализации

Автоматизация нашей инфраструктуры

Наши технические статьи в блоге

Наши корпоративные кейс-стади