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:

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.

Další podrobnosti o našich možnostech infrastruktury naleznete zde:

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:

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.

Zjistěte více o našich vzorcích pro zpracování chyb:

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ů CPU
  • cpupro – 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:

Pro analýzu snímků haldy:

  1. Nainstalujte v8-profiler-next pro generování snapshotů
  2. Použijte cpupro pro analýzu vygenerovaných snapshotů
  3. Implementujte monitorovací prahy podobně jako v našem monitor-server.js
  4. Nastavte automatické čištění pro správu úložiště snapshotů
  5. Vytvořte obslužné rutiny signálů pro profilování na vyžádání v produkčním prostředí

Pro profilování CPU:

  1. Generování profilů CPU během období vysokého zatížení
  2. Analýza pomocí cpupro pro identifikaci úzkých míst
  3. Zaměření na aktivní cesty a optimalizační příležitosti
  4. 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:

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:

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

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:

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

Naše implementace serveru

Naše automatizace infrastruktury

Naše technické příspěvky na blogu

Naše podnikové případové studie