Node.js-tuotantoinfrastruktuurin optimointi: parhaat käytännöt

Esipuhe

Forward Emaililla olemme vuosia hioneet Node.js-tuotantoympäristöämme. Tämä kattava opas jakaa taisteluissa testatut Node.js-tuotantoympäristön käyttöönoton parhaat käytännöt keskittyen suorituskyvyn optimointiin, valvontaan ja Node.js-sovellusten skaalaamisesta miljoonien päivittäisten tapahtumien käsittelyyn oppimiimme asioihin.

Yhden ytimen suorituskyvyn optimoinnin vallankumouksemme, 573 %

Kun siirryimme Intel-prosessoreista AMD Ryzen -prosessoreihin, saavutimme 573 %:n suorituskyvyn parannuksen Node.js-sovelluksissamme. Tämä ei ollut vain pieni optimointi – se muutti perusteellisesti Node.js-sovellustemme suorituskykyä tuotannossa ja osoittaa yhden ytimen suorituskyvyn optimoinnin tärkeyden kaikissa Node.js-sovelluksissa.

Tip

Node.js:n tuotantokäyttöönoton parhaiden käytäntöjen kannalta laitteistovalinta on ratkaisevan tärkeää. Valitsimme DataPacket-hostingin erityisesti heidän AMD Ryzen -suorittimensa saatavuuden vuoksi, koska yhden ytimen suorituskyky on ratkaisevan tärkeää Node.js-sovelluksille, koska JavaScriptin suorittaminen on yksisäikeistä.

Miksi yhden ytimen suorituskyvyn optimointi on tärkeää Node.js:lle

Siirtymisemme Intelistä AMD Ryzeniin johti seuraaviin:

  • 573 %:n suorituskyvyn parannus pyyntöjen käsittelyssä (dokumentoitu kohdassa statussivumme GitHub-ongelma #1519)
  • Käsittelyviiveet poistettu lähes välittömiin vastauksiin (mainittu kohdassa GitHub-ongelma #298)
  • Parempi hinta-laatusuhde Node.js-tuotantoympäristöissä
  • Parannetut vasteajat kaikissa sovelluspäätepisteissämme

Suorituskyvyn parannus oli niin merkittävä, että pidämme nyt AMD Ryzen -prosessoreita välttämättöminä kaikissa vakavissa Node.js-tuotantoympäristöissä, olipa kyseessä sitten verkkosovellukset, API-rajapinnat, mikropalvelut tai muut Node.js-työkuormat.

Lisätietoja infrastruktuurivalinnoistamme on täällä:

Node.js-tuotantoympäristön asetukset: Teknologiapinomme

Node.js-tuotannon käyttöönoton parhaisiin käytäntöihimme kuuluvat harkitut teknologiavalinnat, jotka perustuvat vuosien tuotantokokemukseen. Tässä on mitä käytämme ja miksi nämä valinnat pätevät kaikkiin Node.js-sovelluksiin:

Pakettien hallinta: pnpm tuotantotehokkuudelle

Käytämme: pnpm (kiinnitetty versio)

Valitsimme pnpm:n npm:n ja yarnin sijaan Node.js-tuotantoympäristömme asetuksiin, koska:

  • Nopeammat asennusajat CI/CD-putkissa
  • Levytilan tehokkuus kovan linkityksen avulla
  • Tiukka riippuvuuksien ratkaisu, joka estää haamuriippuvuudet
  • Parempi suorituskyky tuotantoympäristöissä

Note

Osana Node.js:n tuotantoympäristön käyttöönoton parhaita käytäntöjämme kiinnitämme kriittisten työkalujen, kuten pnpm:n, tarkat versiot varmistaaksemme yhdenmukaisen toiminnan kaikissa ympäristöissä ja tiimin jäsenten koneilla.

Toteutuksen tiedot:

Verkkokehys: Koa modernia Node.js-tuotantoa varten

Mitä käytämme:

Valitsimme Koan Expressin sijaan Node.js-tuotantoinfrastruktuuriimme sen modernin async/await-tuen ja selkeämmän väliohjelmistorakenteen vuoksi. Perustajamme Nick Baugh osallistui sekä Expressin että Koan kehittämiseen, antaen meille syvällistä näkemystä molempien frameworkien tuotantokäytöstä.

Nämä mallit pätevät riippumatta siitä, rakennatko REST-rajapintoja, GraphQL-palvelimia, web-sovelluksia tai mikropalveluita.

Toteutusesimerkkejämme:

Taustatyön käsittely: Bree tuotannon luotettavuuden varmistamiseksi

Käytämme: bree -ajastinta

Loimme ja ylläpidämme Breetä, koska olemassa olevat työajoittajamme eivät vastanneet tarpeitamme työsäikeiden tuen ja nykyaikaisten JavaScript-ominaisuuksien suhteen Node.js-tuotantoympäristöissä. Tämä koskee kaikkia Node.js-sovelluksia, jotka tarvitsevat taustaprosessointia, ajoitettuja tehtäviä tai työsäikeitä.

Toteutusesimerkkejämme:

Virheiden käsittely: @hapi/boom tuotannon luotettavuutta varten

Käytämme: @hapi/boom

Käytämme @hapi/boom-mallia strukturoituihin virhevastauksiin kaikissa Node.js-tuotantosovelluksissamme. Tämä malli toimii kaikissa Node.js-sovelluksissa, jotka tarvitsevat yhdenmukaista virheenkäsittelyä.

Toteutusesimerkkejämme:

Node.js-sovellusten valvonta tuotannossa

Lähestymistapamme Node.js-sovellusten valvontaan tuotannossa on kehittynyt vuosien mittakaavassa suoritettujen sovellusten myötä. Toteutamme valvontaa useilla tasoilla varmistaaksemme kaikenlaisten Node.js-sovellusten luotettavuuden ja suorituskyvyn.

Järjestelmätason Node.js-tuotannon valvonta

Ydintoteutuksemme: helpers/monitor-server.js

Käytämme: node-os-utils

Tuotannon valvontakynnyksemme (varsinaisesta tuotantokoodistamme):

  • 2 Gt:n keon kokorajoitus automaattisilla hälytyksillä
  • 25 %:n muistin käyttöaste -varoituskynnys
  • 80 %:n suorittimen käyttöaste -varoituskynnys
  • 75 %:n levytilan käyttöaste -varoituskynnys

Warning

Nämä kynnysarvot toimivat tietyssä laitteistokokoonpanossamme. Kun otat käyttöön Node.js-tuotannon valvonnan, tarkista monitor-server.js-toteutuksemme ymmärtääksesi tarkan logiikan ja mukauttaaksesi arvot kokoonpanoosi.

Sovellustason valvonta Node.js-tuotantoympäristössä

Virheluokituksemme: helpers/is-code-bug.js

Tämä apuohjelma erottaa toisistaan:

  • Varsinaisia koodivirheitä, jotka vaativat välitöntä huomiota
  • Käyttäjävirheitä, jotka ovat odotettua toimintaa
  • Ulkoisten palveluiden toimintahäiriöitä, joita emme voi hallita

Tämä malli koskee kaikkia Node.js-sovelluksia – verkkosovelluksia, API-rajapintoja, mikropalveluita tai taustapalveluita.

Lokikirjaustoteutuksemme: helpers/logger.js

Toteutamme kattavan kenttien hävityksen suojataksemme arkaluonteisia tietoja ja samalla säilyttääksemme hyödylliset virheenkorjausominaisuudet Node.js-tuotantoympäristössämme.

Sovelluskohtainen valvonta

Palvelintoteutuksemme:

Jonon valvonta: Käytämme 5 Gt:n jonorajoituksia ja 180 sekunnin aikakatkaisuja pyyntöjen käsittelyssä resurssien loppumisen estämiseksi. Nämä mallit koskevat kaikkia Node.js-sovelluksia, joissa on jonoja tai taustalla tapahtuvaa käsittelyä.

Node.js-tuotannon valvonta PM2-kuntotarkastuksilla

Olemme hioneet Node.js-tuotantoympäristöämme PM2:lla vuosien tuotantokokemuksen perusteella. PM2:n kuntotarkistuksemme ovat välttämättömiä minkä tahansa Node.js-sovelluksen luotettavuuden ylläpitämiseksi.

PM2-kuntotarkastusjärjestelmämme

Ydintoteutuksemme: jobs/check-pm2.js

Node.js-tuotannon valvontamme PM2-terveystarkastuksineen sisältää:

  • Suoritetaan 20 minuutin välein cron-ajoituksen kautta
  • Vaatii vähintään 15 minuutin käyttöajan ennen kuin prosessia pidetään terveenä
  • Tarkistaa prosessin tilan ja muistin käytön
  • Käynnistää epäonnistuneet prosessit automaattisesti uudelleen
  • Estää uudelleenkäynnistyssilmukat älykkään kuntotarkistuksen avulla

Caution

Node.js:n tuotantokäyttöönoton parhaiden käytäntöjen mukaisesti vaadimme vähintään 15 minuutin käyttöaikaa ennen kuin prosessia pidetään terveenä, jotta vältetään uudelleenkäynnistyssilmukat. Tämä estää virheiden kaskadoitumisen, kun prosessit kamppailevat muistin tai muiden ongelmien kanssa.

PM2-tuotantokonfiguraatiomme

Ekosysteemimme asetukset: Tutustu palvelimemme käynnistystiedostoihin Node.js-tuotantoympäristön asennusta varten:

Nämä mallit pätevät riippumatta siitä, käytätkö Express-sovelluksia, Koa-palvelimia, GraphQL-rajapintoja tai mitä tahansa muuta Node.js-sovellusta.

Automaattinen PM2-käyttöönotto

PM2-käyttöönotto: ansible/playbooks/node.yml

Automatisoimme koko PM2-asennuksemme Ansiblen avulla varmistaaksemme Node.js:n yhdenmukaiset tuotantokäyttöönotot kaikilla palvelimillamme.

Tuotantovirheiden käsittely- ja luokittelujärjestelmä

Yksi arvokkaimmista Node.js:n tuotantokäyttöönoton parhaista käytännöistämme on älykäs virheluokittelu, jota sovelletaan kaikkiin Node.js-sovelluksiin:

isCodeBug-toteutuksemme tuotantoympäristöön

Lähde: helpers/is-code-bug.js

Tämä apuohjelma tarjoaa älykkään virheluokittelun Node.js-sovelluksille tuotannossa seuraaviin tarkoituksiin:

  • Priorisoi todelliset virheet käyttäjien virheiden sijaan
  • Paranna tapauksiin reagointiamme keskittymällä todellisiin ongelmiin
  • Vähennä odotettujen käyttäjävirheiden aiheuttamaa hälytysväsymystä
  • Ymmärrä paremmin sovellusten ja käyttäjien aiheuttamia ongelmia

Tämä malli toimii kaikissa Node.js-sovelluksissa – olitpa sitten rakentamassa verkkokauppasivustoja, SaaS-alustoja, API-rajapintoja tai mikropalveluita.

Integrointi tuotantolokitietojemme kanssa

Loggeri-integraatiomme: helpers/logger.js

Loggerimme käyttää isCodeBug-muuttujaa hälytystasojen ja kenttien hävittämisen määrittämiseen, varmistaen, että saamme ilmoituksen todellisista ongelmista ja suodatamme samalla pois kohinaa Node.js-tuotantoympäristössämme.

Lue lisää virheiden käsittelymalleistamme:

Edistynyt suorituskyvyn virheenkorjaus v8-profiler-nextin ja cpupron avulla

Käytämme edistyneitä profilointityökaluja keon tilannevedosten analysointiin ja muistin loppumisen (OOM, Out of Memory) ongelmien, suorituskyvyn pullonkaulojen ja Node.js-muistiongelmien vianmääritykseen tuotantoympäristössämme. Nämä työkalut ovat välttämättömiä kaikille Node.js-sovelluksille, joissa on muistivuotoja tai suorituskykyongelmia.

Profilointimenetelmämme Node.js-tuotantoympäristössä

Suosittelemamme työkalut:

  • v8-profiler-next - Keon tilannevedosten ja suoritinprofiilien luomiseen
  • cpupro - Suoritinprofiilien ja keon tilannevedosten analysointiin

Tip

Käytämme v8-profiler-nextiä ja cpuproa yhdessä luodaksemme täydellisen suorituskyvyn virheenkorjaustyönkulun Node.js-sovelluksillemme. Tämä yhdistelmä auttaa meitä tunnistamaan muistivuotoja, suorituskyvyn pullonkauloja ja optimoimaan tuotantokoodiamme.

Keon tilannevedosanalyysin toteuttaminen

Valvonnan toteutuksemme: helpers/monitor-server.js

Tuotannon valvontaamme kuuluu automaattinen keon tilannevedosten luonti, kun muistin kynnysarvot ylittyvät. Tämä auttaa meitä korjaamaan OOM-ongelmia ennen kuin ne aiheuttavat sovellusten kaatumisia.

Tärkeimmät toteutusmallit:

  • Automaattiset tilannevedokset, kun keon koko ylittää 2 Gt:n kynnyksen
  • Signaalipohjainen profilointi tuotantoympäristön tarvittaessa tapahtuvaa analysointia varten
  • Säilytyskäytännöt tilannevedosten tallennuksen hallintaan
  • Integrointi puhdistustöihimme automatisoitua ylläpitoa varten

Suorituskyvyn virheenkorjauksen työnkulku

Tutki varsinaista toteutustamme:

Kehon tilannevedosanalyysiä varten:

  1. Asenna v8-profiler-next tilannevedosten luomista varten.Käytä cpuproa luotujen tilannevedosten analysointiin.Käytä valvontakynnysarvoja, jotka ovat samanlaisia kuin monitor-server.js-tiedostossamme.Määritä automaattinen puhdistus tilannevedosten tallennuksen hallintaa varten.Luo signaalinkäsittelijöitä tuotantoympäristön tarvepohjaista profilointia varten.**

Suorittimen profilointia varten:

  1. Luo CPU-profiileja korkean kuormituksen aikana
  2. Analysoi cpuprolla pullonkaulojen tunnistamiseksi
  3. Keskity kuumiin polkuihin ja optimointimahdollisuuksiin
  4. Seuraa suorituskyvyn parannuksia ennen/jälkeen

Warning

Keon tilannevedosten ja suoritinprofiilien luominen voi vaikuttaa suorituskykyyn. Suosittelemme rajoituksen käyttöönottoa ja profiloinnin sallimista vain tiettyjä ongelmia tutkittaessa tai huoltokatkosten aikana.

Integrointi tuotannonvalvontaamme

Profilointityökalumme integroituvat laajempaan seurantastrategiaamme:

  • Automaattinen käynnistys muistin/prosessorin kynnysarvojen perusteella
  • Hälytysten integrointi suorituskykyongelmien havaitsemisen yhteydessä
  • Historiallinen analyysi suorituskykytrendien seuraamiseksi ajan kuluessa
  • Korrelaatio sovellusmittareiden kanssa kattavaa virheenkorjausta varten

Tämä lähestymistapa on auttanut meitä tunnistamaan ja ratkaisemaan muistivuotoja, optimoimaan kuumakoodipolkuja ja ylläpitämään vakaata suorituskykyä Node.js-tuotantoympäristössämme.

Node.js-tuotantoinfrastruktuurin suojaus

Toteutamme Node.js-tuotantoinfrastruktuurimme kattavan tietoturvan Ansible-automaation avulla. Nämä käytännöt koskevat kaikkia Node.js-sovelluksia:

Järjestelmätason suojaus Node.js-tuotantoympäristössä

Ansible-toteutuksemme: ansible/playbooks/security.yml

Keskeiset turvatoimenpiteemme Node.js-tuotantoympäristöissä:

  • Vaihtotoiminto poistettu käytöstä estää arkaluonteisten tietojen kirjoittamisen levylle.
  • Ydinvedokset poistettu käytöstä estää arkaluonteisia tietoja sisältävien muistivedosten tallentamisen.
  • USB-tallennustila estetty estää luvattoman tietojen käytön.
  • Ydinparametrien säätö sekä turvallisuuden että suorituskyvyn parantamiseksi.

Warning

Kun Node.js:n tuotantokäyttöönoton parhaita käytäntöjä toteutetaan, swap-toiminnon poistaminen käytöstä voi aiheuttaa muistin loppumisesta johtuvia katkoksia, jos sovelluksesi ylittää käytettävissä olevan RAM-muistin. Seuraamme muistin käyttöä tarkasti ja mitoitamme palvelimemme asianmukaisesti.

Sovelluksen suojaus Node.js-sovelluksille

Lokikentän poisto: helpers/logger.js

Poistamme lokeista arkaluonteisia kenttiä, kuten salasanoja, tokeneita, API-avaimia ja henkilötietoja. Tämä suojaa käyttäjien yksityisyyttä ja säilyttää samalla virheenkorjausominaisuudet missä tahansa Node.js-tuotantoympäristössä.

Infrastruktuurin tietoturvan automaatio

Täydellinen Ansible-kokoonpanomme Node.js-tuotantoa varten:

Turvallisuussisältömme

Lue lisää turvallisuuslähestymistavastamme:

Tietokannan arkkitehtuuri Node.js-sovelluksille

Käytämme Node.js-sovelluksillemme optimoitua hybriditietokantamallia. Näitä malleja voidaan soveltaa mihin tahansa Node.js-sovellukseen:

SQLite-toteutus Node.js-tuotantoympäristöön

Mitä käytämme:

Kokoonpanomme: ansible/playbooks/sqlite.yml

Käytämme SQLitea käyttäjäkohtaiseen dataan Node.js-sovelluksissamme, koska se tarjoaa:

  • Tietojen eristäminen käyttäjää/vuokralaista kohden
  • Parempi suorituskyky yhden käyttäjän kyselyissä
  • Yksinkertaistettu varmuuskopiointi ja siirto
  • Vähemmän monimutkaisuutta verrattuna jaettuihin tietokantoihin

Tämä malli toimii hyvin SaaS-sovelluksille, usean vuokralaisen järjestelmille tai mille tahansa Node.js-sovellukselle, joka tarvitsee datan eristämistä.

MongoDB-toteutus Node.js-tuotantoympäristöön

Mitä käytämme:

Asetuksemme toteutus: helpers/setup-mongoose.js

Kokoonpanomme: config/mongoose.js

Käytämme MongoDB:tä sovellusdatalle Node.js-tuotantoympäristössämme, koska se tarjoaa:

  • Joustava skeema kehittyville tietorakenteille
  • Parempi suorituskyky monimutkaisille kyselyille
  • Vaakasuuntainen skaalaus -ominaisuudet
  • Rikas kyselykieli

Note

Hybridi-lähestymistapamme optimoituu juuri meidän käyttötapaukseemme. Tutki todellisia tietokannan käyttömalleja koodikannassamme ja selvitä, sopiiko tämä lähestymistapa Node.js-sovelluksesi tarpeisiin.

Node.js-tuotannon taustatyön käsittely

Rakensimme taustatyöarkkitehtuurimme Breen ympärille luotettavaa Node.js-tuotantoympäristöä varten. Tämä koskee kaikkia Node.js-sovelluksia, jotka tarvitsevat taustaprosessointia:

Bree-palvelimemme tuotantokäyttöönotto

Päätoteutuksemme: bree.js

Ansible-käyttöönottomme: ansible/playbooks/bree.yml

Tuotantotyön esimerkkejä

Terveydentilan seuranta: jobs/check-pm2.js

Siivousautomaatio: jobs/cleanup-tmp.js

Kaikki työpaikkamme: Selaa koko työpaikkahakemistoamme

Nämä mallit soveltuvat kaikkiin Node.js-sovelluksiin, jotka tarvitsevat:

  • Ajoitetut tehtävät (tietojenkäsittely, raportit, siivous)
  • Taustakäsittely (kuvien koon muuttaminen, sähköpostien lähettäminen, tietojen tuonti)
  • Kunnonvalvonta ja ylläpito
  • Työsäikeiden käyttöaste prosessoriintensiivisissä tehtävissä

Node.js-tuotantoympäristön työajoitusmallimme

Tutki työpaikkahakemistossamme olevia todellisia työaikataulujamme ymmärtääksesi:

  • Kuinka toteutamme cron-tyyppisen ajoituksen Node.js-tuotannossa
  • Virheenkäsittely- ja uudelleenyrityslogiikkamme
  • Työsäikeiden käyttö prosessoriintensiivisissä tehtävissä

Automaattinen ylläpito Node.js-tuotantosovelluksille

Toteutamme ennakoivaa ylläpitoa estääksemme yleisiä Node.js-tuotanto-ongelmia. Nämä mallit pätevät kaikkiin Node.js-sovelluksiin:

Siivoustoteutuksemme

Lähde: jobs/cleanup-tmp.js

Node.js-tuotantosovellusten automaattinen ylläpitomme kohdistuu seuraaviin tavoitteisiin:

  • Väliaikaiset tiedostot, jotka ovat yli 24 tuntia vanhoja
  • Lokitiedostot, jotka ovat säilytysrajan ulkopuolella
  • Välimuistitiedostot ja väliaikaiset tiedot
  • Ladatut tiedostot, joita ei enää tarvita
  • Kehon tilannevedokset suorituskyvyn virheenkorjauksesta

Nämä mallit koskevat kaikkia Node.js-sovelluksia, jotka luovat väliaikaisia tiedostoja, lokeja tai välimuistissa olevia tietoja.

Levytilan hallinta Node.js-tuotantoympäristössä

Valvontakynnyksemme: helpers/monitor-server.js

  • Jonorajoitukset taustakäsittelylle
  • 75 %:n levytilan käyttöaste varoituskynnys
  • Automaattinen puhdistus kynnysten ylittyessä

Infrastruktuurin ylläpidon automatisointi

Ansible-automaatiomme Node.js-tuotantoon:

Node.js:n tuotantokäyttöönoton toteutusopas

Tutustu tuotantokäytön parhaisiin käytäntöihin varsinaisessa koodissamme

Aloita näillä avaintiedostoilla Node.js-tuotantoympäristön asennusta varten:

  1. Määritys: config/index.js
  2. Valvonta: helpers/monitor-server.js
  3. Virheiden käsittely: helpers/is-code-bug.js
  4. Lokikirjaus: helpers/logger.js
  5. Prosessin tila: jobs/check-pm2.js

Opi blogikirjoituksistamme

Tekniset toteutusoppaamme Node.js-tuotantoon:

Infrastruktuurin automatisointi Node.js-tuotantoympäristöön

Ansible-käsikirjamme Node.js:n tuotantokäyttöönottoa varten:

Tapaustutkimuksemme

Yrityskäyttöönottomme:

Yhteenveto: Node.js:n tuotantokäyttöönoton parhaat käytännöt

Node.js-tuotantoinfrastruktuurimme osoittaa, että Node.js-sovellukset voivat saavuttaa yritystason luotettavuuden seuraavien ominaisuuksien ansiosta:

  • Todistetut laitteistovalinnat (AMD Ryzen 573 %:n yhden ytimen suorituskyvyn optimointiin)
  • Taistelussa testattu Node.js-tuotannon valvonta tietyillä kynnysarvoilla ja automaattisilla vasteilla
  • Älykäs virheluokittelu parantaakseen tapahtumiin reagointia tuotantoympäristöissä
  • Edistynyt suorituskyvyn virheenkorjaus v8-profiler-nextin ja cpupron avulla OOM:n estämiseksi
  • Kattava tietoturvan vahvistaminen Ansible-automaation avulla
  • Hybriditietokanta-arkkitehtuuri optimoitu sovellustarpeisiin
  • Automaattinen ylläpito yleisten Node.js-tuotanto-ongelmien estämiseksi

Tärkein oppi: Tutki varsinaisia toteutustiedostojamme ja blogikirjoituksiamme yleisten parhaiden käytäntöjen noudattamisen sijaan. Koodikantaamme tarjoaa reaalimaailman malleja Node.js:n tuotantokäyttöönotolle, joita voidaan mukauttaa mihin tahansa Node.js-sovellukseen – verkkosovelluksiin, API-rajapintoihin, mikropalveluihin tai taustapalveluihin.

Täydellinen resurssiluettelo Node.js-tuotantoa varten

Keskeiset toteutustiedostomme

Palvelintoteutuksemme

Infrastruktuuriautomaatiomme

Tekniset blogikirjoituksemme

Yritystapaustutkimukseni