Hoe Node.js-productie-infrastructuur te optimaliseren: aanbevolen procedures

Voorwoord

Bij Forward Email hebben we jarenlang gewerkt aan het perfectioneren van de configuratie van onze Node.js-productieomgeving. Deze uitgebreide gids deelt onze beproefde best practices voor Node.js-productie-implementatie, met de nadruk op prestatieoptimalisatie, monitoring en de lessen die we hebben geleerd bij het schalen van Node.js-applicaties om miljoenen dagelijkse transacties te verwerken.

Onze 573% Single Core Performance Optimalisatie Revolutie

Toen we migreerden van Intel- naar AMD Ryzen-processors, behaalden we een 573% prestatieverbetering in onze Node.js-applicaties. Dit was niet zomaar een kleine optimalisatie: het veranderde fundamenteel de prestaties van onze Node.js-applicaties in productie en toont het belang aan van single-core prestatieoptimalisatie voor elke Node.js-applicatie.

Tip

Voor best practices voor Node.js-productie-implementaties is de hardwarekeuze cruciaal. We hebben specifiek gekozen voor DataPacket-hosting vanwege de beschikbaarheid van hun AMD Ryzen, omdat single-core prestaties cruciaal zijn voor Node.js-applicaties, aangezien JavaScript single-threaded wordt uitgevoerd.

Waarom Single Core-prestatieoptimalisatie belangrijk is voor Node.js

Onze migratie van Intel naar AMD Ryzen resulteerde in:

  • 573% prestatieverbetering bij aanvraagverwerking (gedocumenteerd in GitHub Issue #1519) op onze statuspagina
  • Verwerkingsvertragingen geëlimineerd tot vrijwel directe reacties (genoemd in GitHub Issue #298)
  • Betere prijs-prestatieverhouding voor Node.js-productieomgevingen
  • Verbeterde responstijden voor al onze applicatie-endpoints

De prestatieverbetering was zo significant dat we AMD Ryzen-processors nu essentieel achten voor elke serieuze Node.js-productie-implementatie, of u nu webapplicaties, API's, microservices of andere Node.js-workloads uitvoert.

Voor meer informatie over onze infrastructuurkeuzes, bekijk:

Node.js-productieomgeving instellen: onze technologie-stack

Onze best practices voor Node.js-productie-implementatie omvatten weloverwogen technologische keuzes, gebaseerd op jarenlange productie-ervaring. Dit is wat we gebruiken en waarom deze keuzes van toepassing zijn op elke Node.js-applicatie:

Pakketbeheerder: pnpm voor productie-efficiëntie

Wat we gebruiken: pnpm (vastgezette versie)

We hebben voor pnpm gekozen boven npm en yarn voor onze Node.js-productieomgeving omdat:

  • Snellere installatietijden in CI/CD-pipelines
  • Efficiëntie van schijfruimte door hardlinking
  • Strikte afhankelijkheidsresolutie die fantoomafhankelijkheden voorkomt
  • Betere prestaties in productie-implementaties

Note

Als onderdeel van onze best practices voor Node.js-productie-implementaties, pinnen we exacte versies van kritieke tools zoals pnpm om consistent gedrag in alle omgevingen en op alle machines van teamleden te garanderen.

Implementatiedetails:

Webframework: Koa voor moderne Node.js-productie

Wat wij gebruiken:

We kozen Koa boven Express voor onze Node.js-productie-infrastructuur vanwege de moderne async/await-ondersteuning en overzichtelijke middleware-compositie. Onze oprichter Nick Baugh heeft bijgedragen aan zowel Express als Koa, waardoor we diepgaand inzicht hebben gekregen in beide frameworks voor gebruik in productie.

Deze patronen zijn van toepassing ongeacht of u REST API's, GraphQL-servers, webapplicaties of microservices bouwt.

Onze implementatievoorbeelden:

Achtergrondtaakverwerking: Bree voor productiebetrouwbaarheid

Wat we gebruiken: bree scheduler

We hebben Bree ontwikkeld en onderhouden omdat bestaande taakplanners niet voldeden aan onze behoeften aan ondersteuning voor worker threads en moderne JavaScript-functionaliteit in Node.js-productieomgevingen. Dit geldt voor elke Node.js-applicatie die achtergrondverwerking, geplande taken of worker threads nodig heeft.

Onze implementatievoorbeelden:

Foutbehandeling: @hapi/boom voor productiebetrouwbaarheid

Wat we gebruiken: @hapi/boom

We gebruiken @hapi/boom voor gestructureerde foutreacties in onze Node.js-productieapplicaties. Dit patroon werkt voor elke Node.js-applicatie die consistente foutverwerking nodig heeft.

Onze implementatievoorbeelden:

Hoe Node.js-applicaties in productie te monitoren

Onze aanpak voor het monitoren van Node.js-applicaties in productie is geëvolueerd door de jaren heen, waarin we applicaties op schaal hebben uitgevoerd. We implementeren monitoring op meerdere lagen om de betrouwbaarheid en prestaties van elk type Node.js-applicatie te garanderen.

Node.js-productiebewaking op systeemniveau

Onze kernimplementatie: helpers/monitor-server.js

Wat we gebruiken: node-os-utils

Onze productiebewakingsdrempels (op basis van onze daadwerkelijke productiecode):

  • Limiet voor heapgrootte van 2 GB met automatische waarschuwingen
  • Waarschuwingsdrempel voor 25% geheugengebruik
  • Waarschuwingsdrempel voor 80% CPU-gebruik
  • Waarschuwingsdrempel voor 75% schijfgebruik

Warning

Deze drempelwaarden werken voor onze specifieke hardwareconfiguratie. Bekijk bij de implementatie van Node.js-productiemonitoring onze monitor-server.js-implementatie om de exacte logica te begrijpen en de waarden aan te passen aan uw configuratie.

Monitoring op applicatieniveau voor Node.js-productie

Onze foutclassificatie: helpers/is-code-bug.js

Deze helper maakt onderscheid tussen:

  • Werkelijke codefouten die onmiddellijke aandacht vereisen
  • Gebruikersfouten die verwacht gedrag zijn
  • Externe servicefouten die we niet kunnen beheersen

Dit patroon is van toepassing op alle Node.js-toepassingen: webapps, API's, microservices of achtergrondservices.

Onze logging-implementatie: helpers/logger.js

We maken gebruik van uitgebreide veldredactie om gevoelige informatie te beschermen, terwijl we tegelijkertijd nuttige debugmogelijkheden in onze Node.js-productieomgeving behouden.

Toepassingsspecifieke monitoring

Onze serverimplementaties:

Wachtrijbewaking: We implementeren wachtrijlimieten van 5 GB en time-outs van 180 seconden voor de verwerking van aanvragen om resource-uitputting te voorkomen. Deze patronen zijn van toepassing op elke Node.js-applicatie met wachtrijen of achtergrondverwerking.

Node.js-productiebewaking met PM2-gezondheidscontroles

We hebben onze Node.js-productieomgeving geoptimaliseerd met PM2, dankzij jarenlange productie-ervaring. Onze PM2-statuscontroles zijn essentieel voor het behoud van de betrouwbaarheid van elke Node.js-applicatie.

Ons PM2-gezondheidscontrolesysteem

Onze kernimplementatie: jobs/check-pm2.js

Onze Node.js-productiemonitoring met PM2-statuscontroles omvat:

  • Wordt elke 20 minuten uitgevoerd via cron-planning
  • Vereist minimaal 15 minuten uptime voordat een proces als gezond wordt beschouwd
  • Valideert de processtatus en het geheugengebruik
  • Herstart automatisch mislukte processen
  • Voorkomt herstartlussen door middel van intelligente statuscontrole

Caution

Voor de best practices voor Node.js-productie-implementaties vereisen we een uptime van minimaal 15 minuten voordat een proces als gezond wordt beschouwd om herstartlussen te voorkomen. Dit voorkomt opeenvolgende fouten wanneer processen problemen hebben met geheugen of andere problemen.

Onze PM2-productieconfiguratie

Onze ecosysteemconfiguratie: Bestudeer onze serveropstartbestanden voor de configuratie van de Node.js-productieomgeving:

Deze patronen zijn van toepassing ongeacht of u Express-apps, Koa-servers, GraphQL API's of andere Node.js-toepassingen uitvoert.

Geautomatiseerde PM2-implementatie

PM2-implementatie: ansible/playbooks/node.yml

We automatiseren onze volledige PM2-configuratie via Ansible om consistente Node.js-productie-implementaties op al onze servers te garanderen.

Productiefoutverwerkings- en classificatiesysteem

Een van onze meest waardevolle best practices voor Node.js-productie-implementatie is intelligente foutclassificatie die van toepassing is op elke Node.js-applicatie:

Onze isCodeBug-implementatie voor productie

Bron: helpers/is-code-bug.js

Deze helper biedt intelligente foutclassificatie voor Node.js-toepassingen in productie om:

  • Prioriteit geven aan daadwerkelijke bugs boven gebruikersfouten
  • Onze incidentrespons verbeteren door ons te richten op echte problemen
  • Minder waarschuwingsmoeheid door verwachte gebruikersfouten
  • Beter inzicht in applicatie- versus door gebruikers gegenereerde problemen

Dit patroon werkt voor alle Node.js-toepassingen, of u nu e-commercesites, SaaS-platforms, API's of microservices bouwt.

Integratie met onze productieregistratie

Onze logger-integratie: helpers/logger.js

Onze logger gebruikt isCodeBug om waarschuwingsniveaus en veldredactie te bepalen. Zo worden we op de hoogte gehouden van echte problemen en wordt ruis in onze Node.js-productieomgeving weggefilterd.

Meer informatie over onze foutverwerkingspatronen:

Geavanceerde prestatie-debugging met v8-profiler-next en cpupro

We gebruiken geavanceerde profileringstools om heap snapshots te analyseren en OOM (Out of Memory)-problemen, prestatieknelpunten en Node.js-geheugenproblemen in onze productieomgeving te debuggen. Deze tools zijn essentieel voor elke Node.js-applicatie die geheugenlekken of prestatieproblemen ondervindt.

Onze profileringsaanpak voor Node.js-productie

Door ons aanbevolen gereedschap:

  • v8-profiler-next - Voor het genereren van heap-snapshots en CPU-profielen
  • cpupro - Voor het analyseren van CPU-profielen en heap-snapshots

Tip

We gebruiken v8-profiler-next en cpupro samen om een complete performance debugging workflow voor onze Node.js-applicaties te creëren. Deze combinatie helpt ons geheugenlekken en prestatieknelpunten te identificeren en onze productiecode te optimaliseren.

Hoe we heap-snapshotanalyse implementeren

Onze monitoring-implementatie: helpers/monitor-server.js

Onze productiemonitoring omvat het automatisch genereren van heap snapshots wanneer geheugendrempels worden overschreden. Dit helpt ons OOM-problemen te debuggen voordat ze applicatiecrashes veroorzaken.

Belangrijkste implementatiepatronen:

  • Automatische snapshots wanneer de heapgrootte de drempelwaarde van 2 GB overschrijdt
  • Signaalgebaseerde profilering voor on-demand analyse in productie
  • Bewaarbeleid voor het beheer van snapshotopslag
  • Integratie met onze opschoontaken voor geautomatiseerd onderhoud

Prestatie-debugworkflow

Bestudeer onze daadwerkelijke implementatie:

Voor heap snapshot-analyse:

  1. Installeer v8-profiler-next voor het genereren van snapshots
  2. Gebruik cpupro voor het analyseren van de gegenereerde snapshots
  3. Implementeer monitoringdrempels vergelijkbaar met onze monitor-server.js
  4. Stel automatische opschoning in om de snapshotopslag te beheren
  5. Maak signaalhandlers voor on-demand profilering in productie

Voor CPU-profilering:

  1. Genereer CPU-profielen tijdens perioden met hoge belasting
  2. Analyseer met CPUPro om knelpunten te identificeren
  3. Focus op hot paths en optimalisatiemogelijkheden
  4. Monitor prestatieverbeteringen voor/na

Warning

Het genereren van heap snapshots en CPU-profielen kan de prestaties beïnvloeden. We raden aan om throttling te implementeren en profilering alleen in te schakelen bij het onderzoeken van specifieke problemen of tijdens onderhoudsperiodes.

Integratie met onze productiemonitoring

Onze profileringshulpmiddelen integreren met onze bredere monitoringstrategie:

  • Automatische triggering op basis van geheugen-/CPU-drempelwaarden
  • Waarschuwingsintegratie wanneer prestatieproblemen worden gedetecteerd
  • Historische analyse om prestatietrends in de loop van de tijd te volgen
  • Correlatie met applicatiestatistieken voor uitgebreide foutopsporing

Dankzij deze aanpak konden we geheugenlekken identificeren en oplossen, hot code-paden optimaliseren en stabiele prestaties in onze Node.js-productieomgeving garanderen.

Node.js Productie-infrastructuurbeveiliging

We implementeren uitgebreide beveiliging voor onze Node.js-productie-infrastructuur via Ansible-automatisering. Deze procedures zijn van toepassing op elke Node.js-applicatie:

Systeembeveiliging voor Node.js-productie

Onze Ansible-implementatie: ansible/playbooks/security.yml

Onze belangrijkste beveiligingsmaatregelen voor Node.js-productieomgevingen:

  • Swap uitgeschakeld om te voorkomen dat gevoelige gegevens naar schijf worden geschreven
  • Coredumps uitgeschakeld om te voorkomen dat geheugendumps gevoelige informatie bevatten
  • USB-opslag geblokkeerd om ongeautoriseerde gegevenstoegang te voorkomen
  • Kernelparameterafstemming voor zowel beveiliging als prestaties

Warning

Bij het implementeren van best practices voor Node.js-productie-implementaties kan het uitschakelen van swap-bewerkingen leiden tot geheugenuitval als uw applicatie het beschikbare RAM-geheugen overschrijdt. We monitoren het geheugengebruik zorgvuldig en passen onze servers hierop aan.

Toepassingsbeveiliging voor Node.js-toepassingen

Onze logveldredactie: helpers/logger.js

We verwijderen gevoelige velden uit logs, waaronder wachtwoorden, tokens, API-sleutels en persoonlijke gegevens. Dit beschermt de privacy van gebruikers en behoudt de debugmogelijkheden in elke Node.js-productieomgeving.

Automatisering van infrastructuurbeveiliging

Onze volledige Ansible-configuratie voor Node.js-productie:

Onze beveiligingsinhoud

Lees meer over onze beveiligingsaanpak:

Databasearchitectuur voor Node.js-toepassingen

We gebruiken een hybride databasebenadering die geoptimaliseerd is voor onze Node.js-applicaties. Deze patronen kunnen worden aangepast voor elke Node.js-applicatie:

SQLite-implementatie voor Node.js-productie

Wat wij gebruiken:

Onze configuratie: ansible/playbooks/sqlite.yml

We gebruiken SQLite voor gebruikerspecifieke gegevens in onze Node.js-applicaties omdat het het volgende biedt:

  • Gegevensisolatie per gebruiker/tenant
  • Betere prestaties voor query's voor één gebruiker
  • Vereenvoudigde back-up en migratie
  • Verminderde complexiteit vergeleken met gedeelde databases

Dit patroon werkt goed voor SaaS-applicaties, multi-tenant systemen en alle Node.js-applicaties die gegevensisolatie nodig hebben.

MongoDB-implementatie voor Node.js-productie

Wat wij gebruiken:

Onze installatie-implementatie: helpers/setup-mongoose.js

Onze configuratie: config/mongoose.js

Wij gebruiken MongoDB voor applicatiegegevens in onze Node.js-productieomgeving omdat het het volgende biedt:

  • Flexibel schema voor evoluerende datastructuren
  • Betere prestaties voor complexe query's
  • Horizontale schaalbaarheid
  • Rijke querytaal

Note

Onze hybride aanpak is geoptimaliseerd voor onze specifieke use case. Bestudeer onze daadwerkelijke databasegebruikspatronen in de codebase om te zien of deze aanpak past bij de behoeften van uw Node.js-applicatie.

Node.js Productie Achtergrondtaakverwerking

We hebben onze achtergrondtaakarchitectuur rond Bree gebouwd voor een betrouwbare Node.js-productie-implementatie. Dit geldt voor elke Node.js-applicatie die achtergrondverwerking nodig heeft:

Onze Bree-serverinstallatie voor productie

Onze belangrijkste implementatie: bree.js

Onze Ansible-implementatie: ansible/playbooks/bree.yml

Voorbeelden van productietaken

Gezondheidsmonitoring: jobs/check-pm2.js

Automatisering van opruiming: jobs/cleanup-tmp.js

Al onze vacatures: Blader door onze volledige vacaturebank

Deze patronen zijn van toepassing op elke Node.js-toepassing die het volgende nodig heeft:

  • Geplande taken (gegevensverwerking, rapporten, opschonen)
  • Achtergrondverwerking (afbeeldingen verkleinen, e-mails verzenden, gegevens importeren)
  • Statusbewaking en -onderhoud
  • Gebruik van workerthreads voor CPU-intensieve taken

Onze taakplanningspatronen voor Node.js-productie

Bestudeer onze actuele planningspatronen in onze vacaturegids om het volgende te begrijpen:

  • Hoe we cron-achtige planning implementeren in Node.js-productie
  • Onze foutverwerking en retry-logica
  • Hoe we workerthreads gebruiken voor CPU-intensieve taken

Geautomatiseerd onderhoud voor Node.js-productietoepassingen

We implementeren proactief onderhoud om veelvoorkomende productieproblemen in Node.js te voorkomen. Deze patronen zijn van toepassing op elke Node.js-applicatie:

Onze opruimingsimplementatie

Bron: jobs/cleanup-tmp.js

Ons geautomatiseerde onderhoud voor Node.js-productietoepassingen richt zich op:

  • Tijdelijke bestanden ouder dan 24 uur
  • Logbestanden die de bewaartermijn overschrijden
  • Cachebestanden en tijdelijke gegevens
  • Geüploade bestanden die niet langer nodig zijn
  • Heap snapshots van prestatie-debugging

Deze patronen zijn van toepassing op elke Node.js-toepassing die tijdelijke bestanden, logboeken of gecachte gegevens genereert.

Schijfruimtebeheer voor Node.js-productie

Onze monitoringdrempels: helpers/monitor-server.js

  • Wachtrijlimieten voor achtergrondverwerking
  • Waarschuwingsdrempel 75% schijfgebruik
  • Automatisch opschonen bij overschrijding van de drempels

Automatisering van infrastructuuronderhoud

Onze Ansible-automatisering voor Node.js-productie:

Implementatiehandleiding voor Node.js-productie-implementatie

Bestudeer onze daadwerkelijke code voor best practices voor productie

Begin met deze sleutelbestanden voor het instellen van de Node.js-productieomgeving:

  1. Configuratie: config/index.js
  2. Monitoring: helpers/monitor-server.js
  3. Foutafhandeling: helpers/is-code-bug.js
  4. Logboekregistratie: helpers/logger.js
  5. Processtatus: jobs/check-pm2.js

Leer van onze blogberichten

Onze technische implementatiehandleidingen voor Node.js-productie:

Infrastructuurautomatisering voor Node.js-productie

Onze Ansible-playbooks om te bestuderen voor Node.js-productie-implementatie:

Onze casestudies

Onze bedrijfsimplementaties:

Conclusie: Aanbevolen procedures voor Node.js-productie-implementatie

Onze Node.js-productie-infrastructuur laat zien dat Node.js-applicaties betrouwbaarheid op ondernemingsniveau kunnen bereiken door:

  • Bewezen hardwarekeuzes (AMD Ryzen voor 573% single-core prestatie-optimalisatie)
  • In de praktijk geteste Node.js-productiemonitoring met specifieke drempels en geautomatiseerde reacties
  • Slimme foutclassificatie om de respons op incidenten in productieomgevingen te verbeteren
  • Geavanceerde prestatiedebugging met v8-profiler-next en cpupro voor OOM-preventie
  • Uitgebreide beveiligingsversterking door Ansible-automatisering
  • Hybride databasearchitectuur geoptimaliseerd voor applicatiebehoeften
  • Geautomatiseerd onderhoud om veelvoorkomende Node.js-productieproblemen te voorkomen

Belangrijkste punt: Bestudeer onze daadwerkelijke implementatiebestanden en blogposts in plaats van algemene best practices te volgen. Onze codebase biedt realistische patronen voor Node.js-productie-implementatie die kunnen worden aangepast voor elke Node.js-applicatie - webapps, API's, microservices of achtergrondservices.

Volledige bronnenlijst voor Node.js-productie

Onze kernimplementatiebestanden

Onze serverimplementaties

Onze infrastructuurautomatisering

Onze technische blogberichten

Onze Enterprise Case Studies