Как оптимизировать производственную инфраструктуру 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.
Наши примеры реализации:
- Настройка сервера Bree
- Все наши определения задач
- Задача проверки состояния PM2
- Реализация задачи очистки
Обработка ошибок: @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- Для создания снимков кучи и профилей CPUcpupro- Для анализа профилей CPU и снимков кучи
Tip
Мы используем v8-profiler-next и cpupro вместе, чтобы создать полный рабочий процесс отладки производительности для наших приложений Node.js. Эта комбинация помогает выявлять утечки памяти, узкие места производительности и оптимизировать наш производственный код.
Как мы реализуем анализ снимков кучи
Наша реализация мониторинга: helpers/monitor-server.js
Наш производственный мониторинг включает автоматическое создание снимков кучи при превышении порогов памяти. Это помогает нам отлаживать проблемы OOM до того, как они вызовут сбои приложения.
Ключевые шаблоны реализации:
- Автоматические снимки при превышении порога размера кучи в 2 ГБ
- Профилирование по сигналу для анализа по запросу в продакшене
- Политики хранения для управления хранением снимков
- Интеграция с нашими задачами очистки для автоматического обслуживания
Рабочий процесс отладки производительности
Изучите нашу реальную реализацию:
- Реализация мониторинга сервера - Мониторинг кучи и создание снимков
- Задача очистки - Хранение и очистка снимков
- Интеграция логгера - Логирование производительности
Рекомендуемая реализация для вашего приложения Node.js
Для анализа снимков кучи:
- Установите v8-profiler-next для создания снимков
- Используйте cpupro для анализа созданных снимков
- Реализуйте пороги мониторинга, аналогичные monitor-server.js
- Настройте автоматическую очистку для управления хранением снимков
- Создайте обработчики сигналов для профилирования по запросу в продакшене
Для профилирования CPU:
- Создавайте профили CPU в периоды высокой нагрузки
- Анализируйте с помощью cpupro для выявления узких мест
- Сосредоточьтесь на горячих путях и возможностях оптимизации
- Отслеживайте производительность до и после улучшений
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
Что мы используем:
@ladjs/mongoose@ladjs/mongoose-error-messages@zainundin/mongoose-factoryНаша реализация настройки:helpers/setup-mongoose.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:
- Конфигурация:
config/index.js - Мониторинг:
helpers/monitor-server.js - Обработка ошибок:
helpers/is-code-bug.js - Логирование:
helpers/logger.js - Здоровье процесса:
jobs/check-pm2.js
Учитесь на наших блог-постах
Наши технические руководства по реализации для продакшена Node.js:
- Экосистема NPM пакетов
- Создание платежных систем
- Реализация защиты электронной почты
- JavaScript контактные формы
- Интеграция электронной почты с React
Автоматизация инфраструктуры для продакшена 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
Наши основные файлы реализации
- Основная конфигурация
- Зависимости пакетов
- Мониторинг сервера
- Классификация ошибок
- Система логирования
- Проверки здоровья PM2
- Автоматическая очистка
Наши серверные реализации
Автоматизация нашей инфраструктуры
Наши технические статьи в блоге
- Анализ экосистемы NPM
- Реализация платежной системы
- Техническое руководство по защите электронной почты
- JavaScript контактные формы
- Интеграция электронной почты с React
- Руководство по самостоятельному размещению решения