Jak optimalizovat produkční infrastrukturu Node.js: Nejlepší postupy

Předmluva
Ve Forward Email jsme strávili roky zdokonalováním našeho produkčního prostředí Node.js. Tato komplexní příručka sdílí naše osvědčené postupy pro nasazení produkčního prostředí Node.js se zaměřením na optimalizaci výkonu, monitorování a poznatky, které jsme získali při škálování aplikací Node.js pro zpracování milionů transakcí denně.
Naše revoluce v optimalizaci výkonu jednoho jádra s 573% úspěšností
Když jsme migrovali z procesorů Intel na procesory AMD Ryzen, dosáhli jsme 573% zlepšení výkonu v našich aplikacích Node.js. Nešlo jen o drobnou optimalizaci – zásadně to změnilo způsob, jakým naše aplikace Node.js fungují v produkčním prostředí, a demonstruje to důležitost optimalizace výkonu jednoho jádra pro jakoukoli aplikaci Node.js.
Tip
Pro osvědčené postupy nasazení Node.js v produkčním prostředí je výběr hardwaru klíčový. Zvolili jsme hosting DataPacket konkrétně kvůli dostupnosti procesorů AMD Ryzen, protože výkon jednoho jádra je pro aplikace Node.js klíčový, jelikož spouštění JavaScriptu je jednovláknové.
Proč je optimalizace výkonu jednoho jádra důležitá pro Node.js
Naše migrace z Intelu na AMD Ryzen přinesla:
- 573% zlepšení výkonu při zpracování požadavků (dokumentováno v Problém na GitHubu na naší stránce se stavem #1519)
- Eliminováno zpoždění zpracování na téměř okamžité odpovědi (zmíněno v Problém na GitHubu #298)
- Lepší poměr ceny a výkonu pro produkční prostředí Node.js
- Zlepšené doby odezvy napříč všemi koncovými body našich aplikací
Zvýšení výkonu bylo tak významné, že nyní považujeme procesory AMD Ryzen za nezbytné pro jakékoli seriózní produkční nasazení Node.js, ať už provozujete webové aplikace, API, mikroslužby nebo jakoukoli jinou pracovní zátěž Node.js.
Související obsah
Další podrobnosti o našich možnostech infrastruktury naleznete zde:
- Nejlepší služba pro přeposílání e-mailů - Porovnání výkonu
- Řešení s vlastním hostováním - Doporučení ohledně hardwaru
Nastavení produkčního prostředí Node.js: Náš technologický stack
Naše osvědčené postupy pro nasazení Node.js v produkčním prostředí zahrnují promyšlenou volbu technologií založenou na dlouholetých zkušenostech s produkčním prostředím. Zde je seznam toho, co používáme a proč se tyto volby vztahují na jakoukoli aplikaci Node.js:
Správce balíčků: pnpm pro efektivitu produkce
Co používáme: pnpm
(připnutá verze)
Pro naše produkční prostředí Node.js jsme zvolili pnpm před npm a yarn, protože:
- Rychlejší doba instalace v CI/CD pipelines
- Efektivita využití místa na disku díky hard linkingu
- Přísné rozlišení závislostí, které zabraňuje fiktivním závislostem
- Lepší výkon v produkčních nasazeních
Note
V rámci našich osvědčených postupů pro nasazení Node.js v produkčním prostředí používáme přesné verze klíčových nástrojů, jako je pnpm, abychom zajistili konzistentní chování ve všech prostředích a na všech počítačích členů týmu.
Podrobnosti implementace:
Webový framework: Koa pro moderní produkční prostředí Node.js
Co používáme:
Pro naši produkční infrastrukturu Node.js jsme zvolili Koa před Expressem kvůli jeho moderní podpoře async/await a čistšímu složení middlewaru. Náš zakladatel Nick Baugh přispěl k Expressu i Koa a poskytl nám hluboký vhled do obou frameworků pro produkční použití.
Tyto vzory platí pro všechny typy aplikací, ať už vytváříte REST API, servery GraphQL, webové aplikace nebo mikroslužby.
Naše příklady implementace:
Zpracování úlohy na pozadí: Bree pro spolehlivost produkce
Co používáme: Plánovač bree
Vytvořili jsme a udržujeme Bree, protože stávající plánovače úloh nesplňovaly naše potřeby na podporu pracovních vláken a moderní funkce JavaScriptu v produkčním prostředí Node.js. To platí pro všechny aplikace Node.js, které potřebují zpracování na pozadí, plánované úlohy nebo pracovní vlákna.
Naše příklady implementace:
- Nastavení serveru Bree
- Všechny naše definice pracovních pozic
- Úloha kontroly stavu PM2
- Implementace úklidové úlohy
Zpracování chyb: @hapi/boom pro spolehlivost produkce
Co používáme: @hapi/boom
Pro strukturované odpovědi na chyby v našich produkčních aplikacích Node.js používáme @hapi/boom. Tento vzor funguje pro jakoukoli aplikaci Node.js, která vyžaduje konzistentní zpracování chyb.
Naše příklady implementace:
Jak monitorovat aplikace Node.js v produkčním prostředí
Náš přístup k monitorování Node.js aplikací v produkčním prostředí se vyvíjel v průběhu let provozování aplikací ve velkém měřítku. Monitorování implementujeme na více vrstvách, abychom zajistili spolehlivost a výkon pro jakýkoli typ Node.js aplikace.
Monitorování produkce Node.js na úrovni systému
Naše základní implementace: helpers/monitor-server.js
Co používáme: node-os-utils
Naše prahové hodnoty pro monitorování produkce (z našeho skutečného produkčního kódu):
- Limit velikosti haldy 2 GB s automatickými upozorněními
- 25% využití paměti prahová hodnota upozornění
- 80% využití CPU prahová hodnota upozornění
- 75% využití disku prahová hodnota upozornění
Warning
Tyto prahové hodnoty fungují pro naši specifickou hardwarovou konfiguraci. Při implementaci monitorování produkce Node.js si projděte naši implementaci monitor-server.js, abyste pochopili přesnou logiku a upravili hodnoty pro vaše nastavení.
Monitorování na úrovni aplikací pro produkční prostředí Node.js
Naše klasifikace chyby: helpers/is-code-bug.js
Tento pomocník rozlišuje mezi:
- Skutečné chyby v kódu, které vyžadují okamžitou pozornost
- Uživatelské chyby, které představují očekávané chování
- Selhání externích služeb, která nemůžeme ovlivnit
Tento vzor platí pro jakoukoli aplikaci Node.js – webové aplikace, API, mikroslužby nebo služby na pozadí.
Naše implementace protokolování: helpers/logger.js
Implementujeme komplexní redakci polí, abychom chránili citlivé informace a zároveň zachovali užitečné ladicí funkce v našem produkčním prostředí Node.js.
Monitorování specifické pro aplikaci
Naše implementace serverů:
Monitorování front: Implementujeme limity front 5 GB a 180sekundové časové limity pro zpracování požadavků, abychom zabránili vyčerpání zdrojů. Tyto vzorce platí pro všechny aplikace Node.js s frontami nebo zpracováním na pozadí.
Monitorování produkce Node.js s kontrolami stavu PM2
Během let zkušeností s produkčním prostředím Node.js jsme vylepšili nastavení našeho produkčního prostředí Node.js pomocí PM2. Naše kontroly stavu PM2 jsou nezbytné pro udržení spolehlivosti v jakékoli aplikaci Node.js.
Náš systém kontroly stavu PM2
Naše základní implementace: jobs/check-pm2.js
Naše monitorování produkce Node.js s kontrolami stavu PM2 zahrnuje:
- Spouštění každých 20 minut pomocí plánování cron
- Vyžaduje minimálně 15 minut provozuschopnosti předtím, než je proces považován za zdravý
- Ověřuje stav procesu a využití paměti
- Automaticky restartuje neúspěšné procesy
- Zabraňuje smyčkám restartu pomocí inteligentní kontroly stavu
Caution
V rámci osvědčených postupů pro nasazení Node.js v produkčním prostředí požadujeme alespoň 15 minut provozuschopnosti, než proces považujeme za v pořádku, abychom se vyhnuli smyčkám restartování. Tím se zabrání kaskádovým selháním, když procesy mají potíže s pamětí nebo jiné problémy.
Naše produkční konfigurace PM2
Nastavení našeho ekosystému: Prostudujte si spouštěcí soubory našeho serveru pro nastavení produkčního prostředí Node.js:
Tyto vzory platí bez ohledu na to, zda používáte aplikace Express, servery Koa, rozhraní GraphQL API nebo jakoukoli jinou aplikaci Node.js.
Automatizované nasazení PM2
Nasazení PM2: ansible/playbooks/node.yml
Celé nastavení PM2 automatizujeme prostřednictvím Ansible, abychom zajistili konzistentní nasazení Node.js v produkčním prostředí na všech našich serverech.
Systém pro zpracování a klasifikaci produkčních chyb
Jedním z našich nejcennějších osvědčených postupů pro nasazení Node.js v produkčním prostředí je inteligentní klasifikace chyb, která se vztahuje na jakoukoli aplikaci Node.js:
Naše implementace isCodeBug pro produkční prostředí
Zdroj: helpers/is-code-bug.js
Tento pomocník poskytuje inteligentní klasifikaci chyb pro aplikace Node.js v produkčním prostředí pro:
- Upřednostnit skutečné chyby před uživatelskými chybami
- Zlepšit naši reakci na incidenty zaměřením se na skutečné problémy
- Snížit únavu z upozornění na očekávané uživatelské chyby
- Lepší pochopení problémů s aplikacemi vs. problémů generovaných uživateli
Tento vzor funguje pro jakoukoli aplikaci Node.js – ať už vytváříte e-commerce weby, SaaS platformy, API nebo mikroslužby.
Integrace s naším produkčním protokolováním
Integrace našeho loggeru: helpers/logger.js
Náš logger používá isCodeBug
k určení úrovní upozornění a redakce polí, čímž zajišťuje, že dostáváme upozornění na skutečné problémy a zároveň filtrujeme šum v našem produkčním prostředí Node.js.
Související obsah
Zjistěte více o našich vzorcích pro zpracování chyb:
- Budování spolehlivého platebního systému - Vzory pro zpracování chyb
- Ochrana soukromí e-mailů - Zpracování chyb zabezpečení
Pokročilé ladění výkonu s v8-profiler-next a cpupro
V našem produkčním prostředí používáme pokročilé nástroje pro profilování k analýze snapshotů haldy a ladění problémů s OOM (Out of Memory), úzkých míst s výkonem a problémů s pamětí Node.js. Tyto nástroje jsou nezbytné pro jakoukoli aplikaci Node.js, která má problémy s úniky paměti nebo výkonem.
Náš přístup k profilování pro produkční prostředí Node.js
Nářadí, které doporučujeme:
v8-profiler-next
– Pro generování snímků paměti a profilů CPUcpupro
– Pro analýzu profilů CPU a snímků paměti
Tip
Pro vytvoření kompletního pracovního postupu pro ladění výkonu našich Node.js aplikací používáme v8-profiler-next a cpupro. Tato kombinace nám pomáhá identifikovat úniky paměti, úzká místa ve výkonu a optimalizovat náš produkční kód.
Jak implementujeme analýzu snímků haldy
Naše implementace monitorování: helpers/monitor-server.js
Náš produkční monitoring zahrnuje automatické generování snapshotů haldy při překročení prahových hodnot paměti. To nám pomáhá ladit problémy s OOM dříve, než způsobí pády aplikace.
Klíčové implementační vzorce:
- Automatické snímky, když velikost haldy překročí prahovou hodnotu 2 GB
- Profilování na základě signálů pro analýzu na vyžádání v produkčním prostředí
- Zásady uchovávání pro správu úložiště snímků
- Integrace s našimi úlohami čištění pro automatizovanou údržbu
Pracovní postup ladění výkonu
Prostudujte si naši skutečnou implementaci:
- Monitorování implementace serveru - Monitorování haldy a generování snímků
- Úklidová práce - Uchovávání a čištění snímků
- Integrace loggeru - Záznam výkonu
Doporučená implementace pro vaši aplikaci Node.js
Pro analýzu snímků haldy:
- Nainstalujte v8-profiler-next pro generování snapshotů
- Použijte cpupro pro analýzu vygenerovaných snapshotů
- Implementujte monitorovací prahy podobně jako v našem monitor-server.js
- Nastavte automatické čištění pro správu úložiště snapshotů
- Vytvořte obslužné rutiny signálů pro profilování na vyžádání v produkčním prostředí
Pro profilování CPU:
- Generování profilů CPU během období vysokého zatížení
- Analýza pomocí cpupro pro identifikaci úzkých míst
- Zaměření na aktivní cesty a optimalizační příležitosti
- Monitorování výkonu před/po
Warning
Generování snímků paměti haldy a profilů CPU může ovlivnit výkon. Doporučujeme implementovat omezení a profilování povolit pouze při zkoumání konkrétních problémů nebo během intervalů údržby.
Integrace s naším monitorováním produkce
Naše nástroje pro profilování se integrují s naší širší strategií monitorování:
- Automatické spouštění na základě prahových hodnot paměti/CPU
- Integrace upozornění při zjištění problémů s výkonem
- Historická analýza pro sledování trendů výkonu v čase
- Korelace s metrikami aplikace pro komplexní ladění
Tento přístup nám pomohl identifikovat a vyřešit úniky paměti, optimalizovat cesty k aktivnímu kódu a udržovat stabilní výkon v našem produkčním prostředí Node.js.
Zabezpečení produkční infrastruktury Node.js
Pro naši produkční infrastrukturu Node.js implementujeme komplexní zabezpečení prostřednictvím automatizace Ansible. Tyto postupy platí pro všechny aplikace Node.js:
Zabezpečení na úrovni systému pro produkční prostředí Node.js
Naše implementace v Ansible: ansible/playbooks/security.yml
Naše klíčová bezpečnostní opatření pro produkční prostředí Node.js:
- Swap zakázán, aby se zabránilo zápisu citlivých dat na disk
- Výpisy jádra zakázány, aby se zabránilo výpisům paměti obsahujícím citlivé informace
- USB úložiště zablokováno, aby se zabránilo neoprávněnému přístupu k datům
- Ladění parametrů jádra pro zabezpečení i výkon
Warning
Při implementaci osvědčených postupů pro nasazení Node.js v produkčním prostředí může zakázání swapu způsobit ukončení z důvodu nedostatku paměti, pokud vaše aplikace překročí dostupnou paměť RAM. Využití paměti pečlivě monitorujeme a naše servery dimenzujeme odpovídajícím způsobem.
Zabezpečení aplikací pro Node.js
Redakce pole protokolu: helpers/logger.js
Z protokolů odstraňujeme citlivá pole, včetně hesel, tokenů, klíčů API a osobních údajů. To chrání soukromí uživatelů a zároveň zachovává možnosti ladění v jakémkoli produkčním prostředí Node.js.
Automatizace zabezpečení infrastruktury
Naše kompletní nastavení Ansible pro produkční prostředí Node.js:
Náš bezpečnostní obsah
Zjistěte více o našem bezpečnostním přístupu:
- Nejlepší společnosti pro bezpečnostní audity
- Quantum Safe šifrovaný e-mail
- Proč zabezpečení e-mailů s otevřeným zdrojovým kódem
Architektura databáze pro aplikace Node.js
Používáme hybridní databázový přístup optimalizovaný pro naše Node.js aplikace. Tyto vzory lze přizpůsobit pro jakoukoli Node.js aplikaci:
Implementace SQLite pro produkční prostředí Node.js
Co používáme:
Naše konfigurace: ansible/playbooks/sqlite.yml
V našich Node.js aplikacích používáme SQLite pro uživatelsky specifická data, protože poskytuje:
- Izolace dat na uživatele/nájemce
- Lepší výkon pro dotazy jednoho uživatele
- Zjednodušené zálohování a migrace
- Snížení složitosti ve srovnání se sdílenými databázemi
Tento vzor funguje dobře pro SaaS aplikace, multi-tenant systémy nebo jakoukoli aplikaci Node.js, která vyžaduje izolaci dat.
Implementace MongoDB pro produkční prostředí Node.js
Co používáme:
Naše implementace nastavení: helpers/setup-mongoose.js
Naše konfigurace: config/mongoose.js
V našem produkčním prostředí Node.js používáme MongoDB pro aplikační data, protože poskytuje:
- Flexibilní schéma pro vyvíjející se datové struktury
- Lepší výkon pro složité dotazy
- Možnosti horizontálního škálování
- Bohatý dotazovací jazyk
Note
Náš hybridní přístup optimalizuje náš specifický případ použití. Prostudujte si skutečné vzorce využití databáze v kódové základně, abyste zjistili, zda tento přístup vyhovuje potřebám vaší aplikace Node.js.
Zpracování úlohy na pozadí produkčního prostředí Node.js
Naši architekturu úloh na pozadí jsme postavili kolem Bree pro spolehlivé nasazení Node.js v produkčním prostředí. To platí pro jakoukoli aplikaci Node.js, která vyžaduje zpracování na pozadí:
Nastavení našeho serveru Bree pro produkční prostředí
Naše hlavní implementace: bree.js
Naše nasazení Ansible: ansible/playbooks/bree.yml
Příklady produkčních úloh
Monitorování stavu: jobs/check-pm2.js
Automatizace čištění: jobs/cleanup-tmp.js
Všechny naše pracovní nabídky: Prohlédněte si náš kompletní adresář pracovních nabídek
Tyto vzory platí pro jakoukoli aplikaci Node.js, která potřebuje:
- Plánované úlohy (zpracování dat, reporty, čištění)
- Zpracování na pozadí (změna velikosti obrázků, odesílání e-mailů, import dat)
- Monitorování a údržba stavu systému
- Využití pracovních vláken pro úlohy náročné na CPU
Naše vzory plánování úloh pro produkční prostředí Node.js
Prostudujte si naše skutečné vzorce plánování úloh v našem adresáři pracovních nabídek, abyste pochopili:
- Jak implementujeme plánování podobné cronu v produkčním prostředí Node.js
- Naše logika pro zpracování chyb a opakování
- Jak používáme pracovní vlákna pro úlohy náročné na CPU
Automatizovaná údržba produkčních aplikací Node.js
Pro prevenci běžných problémů s produkčním prostředím Node.js implementujeme proaktivní údržbu. Tyto postupy platí pro jakoukoli aplikaci Node.js:
Naše implementace čištění
Zdroj: jobs/cleanup-tmp.js
Naše automatizovaná údržba produkčních aplikací Node.js se zaměřuje na:
- Dočasné soubory starší než 24 hodin
- Soubory protokolů překračující limity uchování
- Soubory mezipaměti a dočasná data
- Nahrané soubory, které již nejsou potřeba
- Snímky paměti z ladění výkonu
Tyto vzory platí pro jakoukoli aplikaci Node.js, která generuje dočasné soubory, protokoly nebo data v mezipaměti.
Správa místa na disku pro produkční prostředí Node.js
Naše monitorovací prahy: helpers/monitor-server.js
- Limity front pro zpracování na pozadí
- 75% využití disku varovný práh
- Automatické čištění při překročení prahových hodnot
Automatizace údržby infrastruktury
Naše automatizace Ansible pro produkci Node.js:
Průvodce implementací produkčního nasazení Node.js
Prostudujte si náš skutečný kód pro osvědčené postupy v produkčním prostředí
Začněte s těmito klíčovými soubory pro nastavení produkčního prostředí Node.js:
- Konfigurace:
config/index.js
- Monitorování:
helpers/monitor-server.js
- Ošetření chyb:
helpers/is-code-bug.js
- Protokolování:
helpers/logger.js
- Stav procesu:
jobs/check-pm2.js
Učte se z našich příspěvků na blogu
Naše technické implementační příručky pro produkční prostředí Node.js:
- Ekosystém balíčků NPM
- Budování platebních systémů
- Implementace ochrany osobních údajů v e-mailu
- Kontaktní formuláře v JavaScriptu
- Integrace e-mailů s React
Automatizace infrastruktury pro produkční prostředí Node.js
Naše playbooky Ansible k nastudování pro produkční nasazení Node.js:
Naše případové studie
Naše podnikové implementace:
- Případová studie Linux Foundation
- Případová studie kanonického Ubuntu
- Přeposílání e-mailů absolventům
Závěr: Nejlepší postupy pro nasazení Node.js v produkčním prostředí
Naše produkční infrastruktura Node.js ukazuje, že aplikace Node.js mohou dosáhnout spolehlivosti podnikové úrovně prostřednictvím:
- Osvědčené hardwarové možnosti (AMD Ryzen pro 573% optimalizaci výkonu jednoho jádra)
- Ověřené monitorování produkce Node.js se specifickými prahovými hodnotami a automatizovanými reakcemi
- Inteligentní klasifikace chyb pro zlepšení reakce na incidenty v produkčním prostředí
- Pokročilé ladění výkonu s v8-profiler-next a cpupro pro prevenci OOM
- Komplexní posílení zabezpečení prostřednictvím automatizace Ansible
- Hybridní databázová architektura optimalizovaná pro potřeby aplikací
- Automatizovaná údržba pro prevenci běžných produkčních problémů Node.js
Klíčové shrnutí: Prostudujte si naše implementační soubory a příspěvky na blogu, místo abyste se řídili obecnými osvědčenými postupy. Naše kódová základna poskytuje reálné vzory pro produkční nasazení Node.js, které lze přizpůsobit pro jakoukoli aplikaci Node.js – webové aplikace, API, mikroslužby nebo služby na pozadí.
Kompletní seznam zdrojů pro produkční verzi Node.js
Naše základní implementační soubory
- Hlavní konfigurace
- Závislosti balíčků
- Monitorování serveru
- Klasifikace chyb
- Systém protokolování
- Kontroly stavu PM2
- Automatizované čištění
Naše implementace serveru
Naše automatizace infrastruktury
Naše technické příspěvky na blogu
- Analýza ekosystému NPM
- Implementace platebního systému
- Technická příručka k ochraně osobních údajů v e-mailu
- Kontaktní formuláře v JavaScriptu
- Integrace e-mailů s React
- Průvodce řešením s vlastním hostováním