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

Průvodce optimalizací výkonu Node.js

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.

Pro více informací o našich infrastrukturních volbách si prohlédněte:

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-ratelimit Vybrali 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:

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.

Zjistěte více o našich vzorcích zpracování 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:

Pro analýzu snapshotů haldy:

  1. Nainstalujte v8-profiler-next pro generování snapshotů
  2. Použijte cpupro pro analýzu vygenerovaných snapshotů
  3. Implementujte prahové hodnoty monitoringu podobně jako v monitor-server.js
  4. Nastavte automatický úklid pro správu úložiště snapshotů
  5. Vytvořte handlery signálů pro profilování na vyžádání v produkci

Pro CPU profilování:

  1. Generujte CPU profily během období vysoké zátěže
  2. Analyzujte pomocí cpupro k identifikaci úzkých míst
  3. Zaměřte se na horké cesty a možnosti optimalizace
  4. 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:

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:

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:

  1. Konfigurace: config/index.js
  2. Monitorování: helpers/monitor-server.js
  3. Zpracování chyb: helpers/is-code-bug.js
  4. Logování: helpers/logger.js
  5. 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:

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

Naše implementace serverů

Naše automatizace infrastruktury

Naše technické blogové příspěvky

Naše podnikové případové studie