Як оптимізувати виробничу інфраструктуру 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 на нашій сторінці стану #1519)
- Усунуто затримки обробки до майже миттєвих відповідей (згадано в проблемі GitHub #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 Production
Що ми використовуємо:
Ми обрали Koa замість Express для нашої виробничої інфраструктури Node.js через його сучасну підтримку async/await та чистішу структуру проміжного програмного забезпечення. Наш засновник Нік Бо зробив свій внесок як у Express, так і в Koa, надавши нам глибоке розуміння обох фреймворків для використання в виробничому середовищі.
Ці шаблони застосовуються незалежно від того, чи створюєте ви REST API, сервери GraphQL, веб-застосунки чи мікросервіси.
Наші приклади впровадження:
Обробка фонового завдання: Bree для надійності виробництва
Що ми використовуємо: планувальник bree
Ми створили та підтримуємо Bree, оскільки існуючі планувальники завдань не задовольняли наші потреби в підтримці робочих потоків та сучасних функціях JavaScript у виробничих середовищах Node.js. Це стосується будь-якої програми Node.js, яка потребує фонової обробки, запланованих завдань або робочих потоків.
Наші приклади впровадження:
- Налаштування сервера Брі
- Усі наші визначення вакансій
- Робота з перевірки стану 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%
- Поріг попередження Використання процесора 80%
- Поріг попередження Використання диска 75%
Warning
Ці порогові значення працюють для нашої конкретної конфігурації обладнання. Під час впровадження моніторингу продакшену Node.js перегляньте нашу реалізацію monitor-server.js, щоб зрозуміти точну логіку та адаптувати значення для вашої конфігурації.
Моніторинг на рівні застосунку для Node.js Production
Наша класифікація помилок: helpers/is-code-bug.js
Цей помічник розрізняє:
- Фактичні помилки коду, які потребують негайної уваги
- Помилки користувачів, які є очікуваною поведінкою
- Збої зовнішніх служб, які ми не можемо контролювати
Цей шаблон застосовується до будь-якої програми Node.js – веб-програм, API, мікросервісів або фонових служб.
Наша реалізація логування: helpers/logger.js
Ми впроваджуємо комплексне редагування полів для захисту конфіденційної інформації, зберігаючи при цьому корисні можливості налагодження в нашому робочому середовищі Node.js.
Моніторинг, специфічний для програми
Наші серверні реалізації:
Моніторинг черги: Ми впроваджуємо обмеження черги 5 ГБ та 180-секундні тайм-аути для обробки запитів, щоб запобігти вичерпанню ресурсів. Ці шаблони застосовуються до будь-якої програми Node.js з чергами або фоновою обробкою.
Моніторинг продакшену Node.js за допомогою перевірок справності PM2
Протягом багатьох років досвіду роботи ми вдосконалили налаштування нашого робочого середовища Node.js за допомогою PM2. Наші перевірки справності PM2 є важливими для підтримки надійності будь-якої програми Node.js.
Наша система перевірки справності PM2
Наша основна реалізація: jobs/check-pm2.js
Наш моніторинг продакшену Node.js з перевірками справності PM2 включає:
- Запускається кожні 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 (недостатньо пам'яті), вузьких місць у продуктивності та проблем із пам'яттю Node.js у нашому робочому середовищі. Ці інструменти є важливими для будь-якої програми Node.js, яка має витоки пам'яті або проблеми з продуктивністю.
Наш підхід до профілювання для Node.js Production
Інструменти, які ми рекомендуємо:
v8-profiler-next
– Для створення знімків купи та профілів процесораcpupro
– Для аналізу профілів процесора та знімків купи
Tip
Ми використовуємо v8-profiler-next та cpupro разом для створення повного робочого процесу налагодження продуктивності для наших Node.js-застосунків. Це поєднання допомагає нам виявляти витоки пам'яті, вузькі місця в продуктивності та оптимізувати наш продакшн-код.
Як ми реалізуємо аналіз знімків купи
Наша реалізація моніторингу: helpers/monitor-server.js
Наш моніторинг виробництва включає автоматичне створення знімків купи пам'яті (snapshot) у разі перевищення порогових значень пам'яті. Це допомагає нам налагоджувати проблеми OOM, перш ніж вони спричинять збої програми.
Ключові моделі впровадження:
- Автоматичні знімки, коли розмір купи перевищує поріг 2 ГБ
- Профілювання на основі сигналів для аналізу на вимогу у виробництві
- Політики зберігання для керування сховищем знімків
- Інтеграція з нашими завданнями очищення для автоматизованого обслуговування
Робочий процес налагодження продуктивності
Вивчіть нашу фактичну реалізацію:
- Реалізація моніторингу сервера – Моніторинг купи та створення знімків
- Робота з прибирання – Збереження та очищення знімків
- Інтеграція логгера – Журнал продуктивності
Рекомендована реалізація для вашої програми Node.js
Для аналізу знімків купи даних:
- Встановіть v8-profiler-next для створення знімків
- Використайте cpupro для аналізу згенерованих знімків
- Реалізуйте пороги моніторингу аналогічно до нашого monitor-server.js
- Налаштуйте автоматичне очищення для керування сховищем знімків
- Створіть обробники сигналів для профілювання на вимогу у продакшені
Для профілювання процесора:
- Створення профілів процесора під час періодів високого навантаження
- Аналіз за допомогою cpupro для виявлення вузьких місць
- Зосередження на гарячих шляхах та можливостях оптимізації
- Моніторинг покращень продуктивності до/після
Warning
Створення знімків купи та профілів процесора може вплинути на продуктивність. Ми рекомендуємо впроваджувати регулювання та вмикати профілювання лише під час дослідження певних проблем або під час періодів обслуговування.
Інтеграція з нашим моніторингом виробництва
Наші інструменти профілювання інтегруються з нашою ширшою стратегією моніторингу:
- Автоматичне запуск на основі порогових значень пам'яті/процесора
- Інтеграція сповіщень при виявленні проблем із продуктивністю
- Історичний аналіз для відстеження тенденцій продуктивності з часом
- Кореляція з показниками програми для комплексного налагодження
Такий підхід допоміг нам виявити та виправити витоки пам'яті, оптимізувати шляхи гарячого коду та підтримувати стабільну продуктивність у нашому робочому середовищі Node.js.
Безпека виробничої інфраструктури Node.js
Ми впроваджуємо комплексну безпеку для нашої виробничої інфраструктури Node.js за допомогою автоматизації Ansible. Ці методи застосовуються до будь-якої програми Node.js:
Безпека на системному рівні для Node.js Production
Наша реалізація Ansible: ansible/playbooks/security.yml
Наші ключові заходи безпеки для виробничих середовищ Node.js:
- Підбірку вимкнено, щоб запобігти запису конфіденційних даних на диск
- Дампи ядра вимкнено, щоб запобігти створенню дампів пам'яті, що містять конфіденційну інформацію
- USB-накопичувач заблоковано, щоб запобігти несанкціонованому доступу до даних
- Налаштування параметрів ядра для безпеки та продуктивності
Warning
Під час впровадження найкращих практик розгортання Node.js у продакшені, вимкнення swap може призвести до завершення роботи через нестачу пам'яті, якщо ваш застосунок перевищує обсяг доступної оперативної пам'яті. Ми ретельно контролюємо використання пам'яті та відповідно підбираємо розмір наших серверів.
Безпека застосунків для Node.js
Редагування поля нашого журналу: helpers/logger.js
Ми видаляємо конфіденційні поля з журналів, включаючи паролі, токени, ключі API та особисту інформацію. Це захищає конфіденційність користувачів, зберігаючи при цьому можливості налагодження в будь-якому робочому середовищі Node.js.
Автоматизація безпеки інфраструктури
Наша повна конфігурація Ansible для Node.js production:
Наш контент щодо безпеки
Дізнайтеся більше про наш підхід до безпеки:
- Найкращі компанії з аудиту безпеки
- Квантова безпечна зашифрована електронна пошта
- Чому безпека електронної пошти з відкритим кодом?
Архітектура бази даних для застосунків Node.js
Ми використовуємо гібридний підхід до баз даних, оптимізований для наших Node.js-додатків. Ці шаблони можна адаптувати для будь-якого Node.js-додатку:
Реалізація SQLite для Node.js Production
Що ми використовуємо:
Наша конфігурація: ansible/playbooks/sqlite.yml
Ми використовуємо SQLite для даних, специфічних для користувача, у наших Node.js-додатках, оскільки він надає:
- Ізоляція даних для кожного користувача/орендаря
- Краща продуктивність для запитів одного користувача
- Спрощене резервне копіювання та міграція
- Зменшення складності порівняно зі спільними базами даних
Цей шаблон добре працює для SaaS-застосунків, багатокористувацьких систем або будь-якого Node.js-застосунку, який потребує ізоляції даних.
Реалізація MongoDB для Node.js Production
Що ми використовуємо:
Наша реалізація налаштувань: helpers/setup-mongoose.js
Наша конфігурація: config/mongoose.js
Ми використовуємо MongoDB для даних додатків у нашому робочому середовищі Node.js, оскільки вона забезпечує:
- Гнучка схема для структур даних, що розвиваються
- Краща продуктивність для складних запитів
- Можливості горизонтального масштабування
- Багата мова запитів
Note
Наш гібридний підхід оптимізовано для нашого конкретного випадку використання. Вивчіть наші фактичні моделі використання бази даних у кодовій базі, щоб зрозуміти, чи відповідає цей підхід потребам вашої програми Node.js.
Обробка фонового завдання Node.js Production
Ми побудували нашу архітектуру фонових завдань навколо 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 Production
Вивчіть наші фактичні схеми планування робіт у нашому каталозі вакансій, щоб зрозуміти:
- Як ми реалізуємо планування, подібне до cron, у продакшені Node.js
- Наша логіка обробки помилок та повторних спроб
- Як ми використовуємо робочі потоки для завдань, що ресурсомісткі для процесора
Автоматизоване обслуговування для виробничих застосунків Node.js
Ми впроваджуємо проактивне обслуговування, щоб запобігти поширеним проблемам у продакшені Node.js. Ці шаблони застосовуються до будь-якої програми Node.js:
Наше впровадження очищення
Джерело: jobs/cleanup-tmp.js
Наша автоматизована підтримка для продакшн-застосунків Node.js спрямована на:
- Тимчасові файли старші за 24 години
- Файли журналів, що перевищують ліміти зберігання
- Файли кешу та тимчасові дані
- Завантажені файли, які більше не потрібні
- Знімки купи даних з налагодження продуктивності
Ці шаблони застосовуються до будь-якої програми Node.js, яка генерує тимчасові файли, журнали або кешовані дані.
Керування дисковим простором для Node.js Production
Наші пороги моніторингу: helpers/monitor-server.js
- Обмеження черги для фонової обробки
- Поріг попередження 75% використання диска
- Автоматичне очищення при перевищенні порогових значень
Автоматизація обслуговування інфраструктури
Наша автоматизація Ansible для Node.js production:
Посібник з впровадження розгортання 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 production:
- Екосистема пакетів NPM
- Побудова платіжних систем
- Впровадження конфіденційності електронної пошти
- Контактні форми JavaScript
- Інтеграція електронної пошти React
Автоматизація інфраструктури для Node.js Production
Наші посібники з Ansible для вивчення під час розгортання Node.js у продакшені:
Наші тематичні дослідження
Наші впровадження на підприємствах:
- Тематичне дослідження фундаменту Linux
- Канонічний приклад Ubuntu
- Пересилання електронної пошти випускників
Висновок: Найкращі практики розгортання 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 Production
Наші основні файли реалізації
- Основна конфігурація
- Залежності пакетів
- Моніторинг сервера
- Класифікація помилок
- Система реєстрації
- Перевірки стану PM2
- Автоматизоване очищення
Реалізації нашого сервера
Автоматизація нашої інфраструктури
Наші технічні дописи в блозі
- Аналіз екосистеми NPM
- Впровадження платіжної системи
- Технічний посібник із конфіденційності електронної пошти
- Контактні форми JavaScript
- Інтеграція електронної пошти React
- Посібник із самостійно розміщених рішень