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. Tento komplexní průvodce sdílí naše osvědčené nejlepší postupy nasazení Node.js do produkce, zaměřené na optimalizaci výkonu, monitorování a lekce, které jsme se naučili při škálování aplikací Node.js pro zpracování milionů denních transakcí.
Naše revoluce v optimalizaci výkonu na jedno jádro o 573 %
Když jsme přešli z procesorů Intel na AMD Ryzen, dosáhli jsme 573% zlepšení výkonu v našich aplikacích Node.js. Nebyla to jen drobná optimalizace – zásadně to změnilo, jak naše aplikace Node.js fungují v produkci, a ukazuje to důležitost optimalizace výkonu na jedno jádro pro jakoukoli aplikaci Node.js.
Tip
Pro nejlepší postupy nasazení Node.js do produkce je kritická volba hardwaru. Konkrétně jsme zvolili hosting DataPacket kvůli dostupnosti AMD Ryzen, protože výkon na jedno jádro je pro aplikace Node.js klíčový, jelikož vykonávání JavaScriptu je jednovláknové.
Proč je optimalizace výkonu na jedno jádro důležitá pro Node.js
Naše migrace z Intel na AMD Ryzen přinesla:
- 573% zlepšení výkonu při zpracování požadavků (zdokumentováno v naší status stránce GitHub Issue #1519)
- Eliminaci zpoždění zpracování na téměř okamžité odpovědi (zmíněno v GitHub Issue #298)
- Lepší poměr cena/výkon pro produkční prostředí Node.js
- Zlepšené doby odezvy na všech našich aplikačních koncových bodech
Zvýšení výkonu bylo natolik 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 zátěž Node.js.
Související obsah
Pro více informací o našich infrastrukturních volbách si prohlédněte:
- Nejlepší služba pro přeposílání e-mailů – srovnání výkonu
- Řešení pro vlastní hosting – doporučení hardwaru
Nastavení produkčního prostředí Node.js: Náš technologický stack
Naše nejlepší postupy nasazení Node.js do produkce zahrnují promyšlené technologické volby založené na letech produkčních zkušeností. Toto používáme a proč jsou tyto volby vhodné pro jakoukoli aplikaci Node.js:
Správce balíčků: pnpm pro produkční efektivitu
Co používáme: pnpm (přesná verze)
Zvolili jsme pnpm místo npm a yarn pro naše produkční prostředí Node.js, protože:
- Rychlejší doby instalace v CI/CD pipelinech
- Efektivita využití místa na disku díky hard linkům
- Přísné řešení závislostí, které zabraňuje neviditelným závislostem
- Lepší výkon při produkčním nasazení
Note
Jako součást našich nejlepších postupů nasazení Node.js do produkce připínáme přesné verze kritických nástrojů jako pnpm, abychom zajistili konzistentní chování ve všech prostředích a na strojích členů týmu.
Detaily implementace:
Webový framework: Koa pro moderní produkci Node.js
Co používáme:
@koa/router@koa/multer@ladjs/koa-simple-ratelimitVybrali jsme Koa místo Express pro naši produkční infrastrukturu Node.js kvůli jeho moderní podpoře async/await a čistší kompozici middleware. Náš zakladatel Nick Baugh přispěl jak do Express, tak do Koa, což nám poskytlo hluboký vhled do obou frameworků pro produkční použití.
Tyto vzory platí bez ohledu na to, zda vytváříte REST API, GraphQL servery, webové aplikace nebo mikroslužby.
Naše příklady implementace:
Zpracování úloh na pozadí: Bree pro produkční spolehlivost
Co používáme: bree plánovač
Vytvořili jsme a udržujeme Bree, protože stávající plánovače úloh nesplňovaly naše požadavky na podporu worker threadů a moderní funkce JavaScriptu v produkčních prostředích Node.js. Toto platí pro jakoukoli aplikaci Node.js, která potřebuje zpracování na pozadí, plánované úlohy nebo worker threaddy.
Naše příklady implementace:
- Nastavení Bree serveru
- Všechny naše definice úloh
- Úloha kontroly zdraví PM2
- Implementace úklidové úlohy
Zpracování chyb: @hapi/boom pro produkční spolehlivost
Co používáme: @hapi/boom
Používáme @hapi/boom pro strukturované chybové odpovědi v našich produkčních aplikacích Node.js. Tento vzor funguje pro jakoukoli aplikaci Node.js, která potřebuje konzistentní zpracování chyb.
Naše příklady implementace:
Jak monitorovat aplikace Node.js v produkci
Náš přístup k monitorování aplikací Node.js v produkci se vyvíjel během let provozu aplikací ve velkém měřítku. Implementujeme monitorování na několika úrovních, abychom zajistili spolehlivost a výkon pro jakýkoli typ aplikace Node.js.
Monitorování produkce Node.js na systémové úrovni
Naše základní implementace: helpers/monitor-server.js
Co používáme: node-os-utils
Naše prahové hodnoty pro produkční monitorování (z našeho skutečného produkčního kódu):
- Limit velikosti heapu 2GB s automatickými upozorněními
- Varovný práh využití paměti 25%
- Upozornění při využití CPU 80%
- Varovný práh využití disku 75%
Warning
Tyto prahové hodnoty fungují pro naši konkrétní hardwarovou konfiguraci. Při implementaci produkčního monitorování Node.js si prostudujte naši implementaci monitor-server.js, abyste pochopili přesnou logiku a přizpůsobili hodnoty pro vaše prostředí.
Monitorování na úrovni aplikace pro produkci Node.js
Naše klasifikace chyb: helpers/is-code-bug.js
Tento pomocník rozlišuje mezi:
- Skutečnými chybami v kódu, které vyžadují okamžitou pozornost
- Chybami uživatele, které jsou očekávaným chováním
- Selháními 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 logování: helpers/logger.js
Implementujeme komplexní redakci polí pro ochranu citlivých informací při zachování užitečných možností ladění v našem produkčním prostředí Node.js.
Monitorování specifické pro aplikaci
Naše implementace serverů:
Monitorování front: Zavádíme limity fronty 5GB a časové limity 180 sekund pro zpracování požadavků, abychom zabránili vyčerpání zdrojů. Tyto vzory platí pro jakoukoli aplikaci Node.js s frontami nebo zpracováním na pozadí.
Produkční monitorování Node.js s PM2 health checks
Naše nastavení produkčního prostředí Node.js s PM2 jsme vylepšili během let produkčních zkušeností. Naše PM2 health checks jsou nezbytné pro udržení spolehlivosti v jakékoli aplikaci Node.js.
Náš systém PM2 health checks
Naše základní implementace: jobs/check-pm2.js
Naše produkční monitorování Node.js s PM2 health checks zahrnuje:
- Spouští se každých 20 minut pomocí cron plánování
- Vyžaduje minimálně 15 minut provozu před tím, než je proces považován za zdravý
- Ověřuje stav procesu a využití paměti
- Automaticky restartuje selhané procesy
- Zabraňuje restartovacím smyčkám pomocí inteligentního kontrolování stavu
Caution
Pro nejlepší postupy nasazení produkce Node.js vyžadujeme 15+ minut provozu před tím, než je proces považován za zdravý, aby se zabránilo restartovacím smyčkám. To zabraňuje kaskádovým selháním, když procesy bojují s pamětí nebo jinými problémy.
Naše produkční konfigurace PM2
Naše nastavení ekosystému: Prostudujte si naše soubory pro spuštění serveru pro nastavení produkčního prostředí Node.js:
Tyto vzory platí, ať už provozujete aplikace Express, servery Koa, GraphQL API nebo jakoukoli jinou aplikaci Node.js.
Automatizované nasazení PM2
Nasazení PM2: ansible/playbooks/node.yml
Automatizujeme celé naše nastavení PM2 pomocí Ansible, abychom zajistili konzistentní produkční nasazení Node.js na všech našich serverech.
Produkční systém zpracování a klasifikace chyb
Jedním z našich nejcennějších osvědčených postupů nasazení produkce Node.js je inteligentní klasifikace chyb, která platí pro jakoukoli aplikaci Node.js:
Naše implementace isCodeBug pro produkci
Zdroj: helpers/is-code-bug.js
Tento pomocník poskytuje inteligentní klasifikaci chyb pro aplikace Node.js v produkci, aby:
- Upřednostnil skutečné chyby před uživatelskými chybami
- Zlepšil naši reakci na incidenty zaměřením na reálné problémy
- Snížil únavu z upozornění způsobenou očekávanými uživatelskými chybami
- Lépe porozuměl problémům aplikace vs. uživatelem generovaným problémům
Tento vzor funguje pro jakoukoli aplikaci Node.js – ať už vytváříte e-commerce stránky, SaaS platformy, API nebo mikroslužby.
Integrace s naším produkčním logováním
Naše integrace loggeru: helpers/logger.js
Náš logger používá isCodeBug k určení úrovní upozornění a redakce polí, což zajišťuje, že dostáváme oznámení o skutečných problémech, zatímco filtruje šum v našem produkčním prostředí Node.js.
Související obsah
Zjistěte více o našich vzorcích zpracování chyb:
- Budování spolehlivého platebního systému - Vzory zpracování chyb
- Ochrana soukromí e-mailů - Zpracování bezpečnostních chyb
Pokročilé ladění výkonu s v8-profiler-next a cpupro
Používáme pokročilé nástroje pro profilování k analýze snapshotů haldy a ladění problémů OOM (Out of Memory), úzkých míst výkonu a problémů s pamětí Node.js v našem produkčním prostředí. Tyto nástroje jsou nezbytné pro jakoukoli aplikaci Node.js, která zažívá úniky paměti nebo problémy s výkonem.
Náš přístup k profilování pro produkci Node.js
Nástroje, které doporučujeme:
v8-profiler-next- Pro generování snapshotů haldy a CPU profilůcpupro- Pro analýzu CPU profilů a snapshotů haldy
Tip
Používáme v8-profiler-next a cpupro společně k vytvoření kompletního workflow ladění výkonu pro naše aplikace Node.js. Tato kombinace nám pomáhá identifikovat úniky paměti, úzká místa výkonu a optimalizovat náš produkční kód.
Jak implementujeme analýzu snapshotů haldy
Naše implementace monitoringu: 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 OOM dříve, než způsobí pád aplikace.
Klíčové implementační vzory:
- Automatické snapshoty při překročení velikosti haldy 2GB
- Profilování na základě signálů pro analýzu na vyžádání v produkci
- Politiky uchovávání pro správu úložiště snapshotů
- Integrace s našimi úklidovými úlohami pro automatickou údržbu
Workflow ladění výkonu
Prostudujte si naši aktuální implementaci:
- Implementace monitor serveru - Monitoring haldy a generování snapshotů
- Úklidová úloha - Uchovávání a úklid snapshotů
- Integrace loggeru - Logování výkonu
Doporučená implementace pro vaši aplikaci Node.js
Pro analýzu snapshotů haldy:
- Nainstalujte v8-profiler-next pro generování snapshotů
- Použijte cpupro pro analýzu vygenerovaných snapshotů
- Implementujte prahové hodnoty monitoringu podobně jako v monitor-server.js
- Nastavte automatický úklid pro správu úložiště snapshotů
- Vytvořte handlery signálů pro profilování na vyžádání v produkci
Pro CPU profilování:
- Generujte CPU profily během období vysoké zátěže
- Analyzujte pomocí cpupro k identifikaci úzkých míst
- Zaměřte se na horké cesty a možnosti optimalizace
- Monitorujte výkon před a po zlepšeních
Warning
Generování snapshotů haldy a CPU profilů může ovlivnit výkon. Doporučujeme implementovat omezení a povolovat profilování pouze při vyšetřování konkrétních problémů nebo během údržbových oken.
Integrace s naším produkčním monitoringem
Naše nástroje pro profilování se integrují s naší širší strategií monitoringu:
- Automatické spouštění na základě prahových hodnot paměti/CPU
- Integrace upozornění při detekci 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 kritické části kódu a udržet stabilní výkon v našem produkčním prostředí Node.js.
Bezpečnost produkční infrastruktury Node.js
Implementujeme komplexní zabezpečení naší produkční infrastruktury Node.js pomocí automatizace Ansible. Tyto postupy platí pro jakoukoli aplikaci Node.js:
Bezpečnost na úrovni systému pro produkci Node.js
Naše implementace 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
- Core dumpy 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ánil neoprávněný přístup k datům
- Ladění parametrů jádra pro bezpečnost i výkon
Warning
Při zavádění osvědčených postupů nasazení produkce Node.js může zakázání swapu způsobit ukončení procesu kvůli nedostatku paměti, pokud vaše aplikace překročí dostupnou RAM. Pečlivě sledujeme využití paměti a správně dimenzujeme naše servery.
Bezpečnost aplikací pro Node.js
Naše redakce polí v logu: helpers/logger.js
Redigujeme citlivá pole v logech včetně hesel, tokenů, API klíčů 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 bezpečnosti infrastruktury
Naše kompletní nastavení Ansible pro produkci 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
- Kvantově bezpečný šifrovaný e-mail
- Proč otevřený zdroj pro bezpečnost e-mailu
Architektura databáze pro aplikace Node.js
Používáme hybridní databázový přístup optimalizovaný pro naše aplikace Node.js. Tyto vzory lze přizpůsobit pro jakoukoli aplikaci Node.js:
Implementace SQLite pro produkci Node.js
Co používáme:
Naše konfigurace: ansible/playbooks/sqlite.yml
Používáme SQLite pro uživatelská data v našich aplikacích Node.js, protože poskytuje:
- Izolaci dat pro každého uživatele/nájemce
- Lepší výkon pro dotazy jednoho uživatele
- Zjednodušenou zálohu a migraci
- Sníženou složitost ve srovnání se sdílenými databázemi
Tento vzor dobře funguje pro SaaS aplikace, multi-tenant systémy nebo jakoukoli aplikaci Node.js, která potřebuje izolaci dat.
Implementace MongoDB pro produkci Node.js
Co používáme:
@ladjs/mongoose@ladjs/mongoose-error-messages@zainundin/mongoose-factoryNaše implementace nastavení:helpers/setup-mongoose.js
Naše konfigurace: config/mongoose.js
Používáme MongoDB pro data aplikace v našem produkčním prostředí Node.js, 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 je optimalizován pro náš konkrétní případ použití. Prostudujte si skutečné vzory využití databáze v kódu, abyste pochopili, zda tento přístup vyhovuje potřebám vaší aplikace Node.js.
Zpracování pozadí úloh v produkci Node.js
Naši architekturu pozadí úloh jsme postavili kolem Bree pro spolehlivé nasazení produkce Node.js. Toto platí pro jakoukoli aplikaci Node.js, která potřebuje zpracování na pozadí:
Naše nastavení Bree serveru pro produkci
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 úklidu: jobs/cleanup-tmp.js
Všechny naše úlohy: Prohlédněte si náš kompletní adresář úloh
Tyto vzory platí pro jakoukoli aplikaci Node.js, která potřebuje:
- Plánované úkoly (zpracování dat, reporty, úklid)
- Zpracování na pozadí (změna velikosti obrázků, odesílání e-mailů, importy dat)
- Monitorování stavu a údržbu
- Využití pracovních vláken pro CPU náročné úkoly
Naše vzory plánování úloh pro produkci Node.js
Prostudujte si skutečné vzory plánování úloh v našem adresáři úloh, abyste pochopili:
- Jak implementujeme plánování podobné cron v produkci Node.js
- Naše zpracování chyb a logiku opakování
- Jak používáme pracovní vlákna pro CPU náročné úkoly
Automatizovaná údržba pro produkční aplikace Node.js
Implementujeme proaktivní údržbu, abychom předešli běžným problémům produkce Node.js. Tyto vzory platí pro jakoukoli aplikaci Node.js:
Naše implementace úklidu
Zdroj: jobs/cleanup-tmp.js
Naše automatizovaná údržba pro produkční aplikace Node.js cílí na:
- Dočasné soubory starší než 24 hodin
- Log soubory přesahující limity uchovávání
- Cache soubory a dočasná data
- Nahrané soubory, které již nejsou potřeba
- Heap snapshoty z ladění výkonu
Tyto vzory platí pro jakoukoli aplikaci Node.js, která generuje dočasné soubory, logy nebo cache data.
Správa místa na disku pro produkci Node.js
Naše prahové hodnoty monitorování: helpers/monitor-server.js
- Limity fronty pro zpracování na pozadí
- Varování při 75 % využití disku
- Automatický úklid při překročení prahových hodnot
Automatizace údržby infrastruktury
Naše Ansible automatizace pro produkci Node.js:
Průvodce implementací produkčního nasazení Node.js
Studujte náš skutečný kód pro nejlepší postupy v produkci
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 - Zpracování chyb:
helpers/is-code-bug.js - Logování:
helpers/logger.js - Zdraví procesu:
jobs/check-pm2.js
Naučte se z našich blogových příspěvků
Naše technické průvodce implementací pro produkci Node.js:
- Ekosystém balíčků NPM
- Budování platebních systémů
- Implementace ochrany soukromí e-mailů
- JavaScript kontaktní formuláře
- Integrace e-mailů v Reactu
Automatizace infrastruktury pro produkci Node.js
Naše Ansible playbooky ke studiu pro nasazení produkce Node.js:
Naše případové studie
Naše podnikové implementace:
Závěr: Nejlepší postupy nasazení produkce Node.js
Naše produkční infrastruktura Node.js ukazuje, že aplikace Node.js mohou dosáhnout podnikové spolehlivosti díky:
- Ověřeným hardwarovým volbám (AMD Ryzen pro optimalizaci výkonu jednoho jádra o 573 %)
- Ověřenému monitorování produkce Node.js s konkrétními prahy a automatizovanými reakcemi
- Chytré klasifikaci chyb pro zlepšení reakce na incidenty v produkčním prostředí
- Pokročilému ladění výkonu s v8-profiler-next a cpupro pro prevenci OOM
- Komplexnímu zpevnění bezpečnosti pomocí Ansible automatizace
- Hybridní databázové architektuře optimalizované pro potřeby aplikace
- Automatizované údržbě k prevenci běžných problémů produkce Node.js
Hlavní závěr: Studujte naše skutečné implementační soubory a blogové příspěvky místo sledování obecných nejlepších postupů. Naše kódová základna poskytuje reálné vzory pro nasazení produkce Node.js, které lze přizpůsobit jakékoli aplikaci Node.js – webovým aplikacím, API, mikroslužbám nebo pozadním službám.
Kompletní seznam zdrojů pro produkci Node.js
Naše hlavní implementační soubory
- Hlavní konfigurace
- Závislosti balíčků
- Monitorování serveru
- Klasifikace chyb
- Systém logování
- Kontroly zdraví PM2
- Automatické čištění
Naše implementace serverů
Naše automatizace infrastruktury
Naše technické blogové příspěvky
- Analýza ekosystému NPM
- Implementace platebního systému
- Technická příručka ochrany soukromí e-mailů
- JavaScript kontaktní formuláře
- Integrace e-mailů v Reactu
- Průvodce vlastní hostovaným řešením