5 forbedringer som vil øke din Node.js-app

Under applikasjonsarbeidsflytene dine er det mange aspekter som trengs for å sikre at koden du skriver utføres med effektivitet på sitt beste. Tenk på at du har bygget en Node.js-applikasjon. Ved produksjonsdistribusjon innser du at applikasjonen din blir mye tregere og tregere.

Vel, på dette tidspunktet er spørsmålet ditt hva kan du gjøre for å få fart på og kjøre Node.js-appen raskere? I denne artikkelen vil vi diskutere tips og verktøy du trenger for å massivt skalere og øke hastigheten på Node.js-applikasjonene.

En oversikt

Node.js er et åpen kildekode-kjøretidsmiljø på tvers av plattformer for JavaScript. Den brukes til å kjøre applikasjoner på serversiden. Node.js brukes til å bygge applikasjoner på alle nivåer som krever en dataintensiv modell.

Node.js er dominerende innen webutvikling på serversiden. Den rangerer som en av de mest populære nettrammene og -teknologiene. Denne Stack Overflow-undersøkelsen gir et gjennomsiktig blikk på hvordan Node.js konkurrerer med andre serversideteknologier som Django, Laravel, Ruby on rails og Flask.

ImageSource

Det er begrunnelser bak den enorme populariteten til Node.js. Dette inkluderer:

  • Node.js er veldig lett å forstå. Node.js er bygget med JavaScript bare bones, det ofte brukte programmeringsspråket. På grunn av JavaScripts popularitet, blir det relativt enkelt å komme i gang med Node.js.

  • Node.js har et gigantisk økosystem, Node Package Manager (NPM). NPM er et Node.js-register som tillater bruk og tilgang til åpen kildekode-biblioteker som dekker hele Node.js-nettutviklingspipeline. Disse bibliotekene lar deg installere kode som du kan bruke umiddelbart. Dette sparer definitivt mye utviklingstid samtidig som det leverer lette, skalerbare og høyhastighetsapper.

  • Node.js er lynende lett og rask, og lar utviklere lage applikasjoner med høy ytelse. Den er bygget på en høyytelses V8-motor for å kompilere og kjøre JavaScript-koden.

Som utvikler vil du utelukkende utnytte Node.js-kapasiteten til å bygge svært skalerbare applikasjoner. Likevel trenger du forskjellige verktøy for å sikre at dine Node.js-applikasjoner kjører enda raskere. La oss diskutere tips og verktøy utviklere kan bruke for å optimalisere og øke den allerede raske arkitekturen som Node.js leverer.

Hvordan øker du Node.js-appen?

1. Bruke en meldingsmegler

En meldingsmegler er en programvare som gir stabil, pålitelig kommunikasjon mellom to eller flere applikasjoner/undersett av en applikasjon. I utgangspunktet kjører en meldingsmegler en arkitekturteknikk som lar deg bryte applikasjoner fra hverandre samtidig som du sørger for asynkron kommunikasjon.

I dette tilfellet er en melding den informasjonen du ønsker å få behandlet fra en søknad til en annen. En megler fungerer som et medium der faktiske datanyttelaster overføres mellom applikasjonene. En meldingsmegler bruker et køsystem til å holde. Den administrerer køer med ordren de mottas og leverer dem til den faktiske parten.

Her er en generell arkitektur for hvordan en meldingsmegler fungerer:

Nå som vi har en ide om hva en meldingsmegler er. Hvordan forbedrer det skalerbarheten til en applikasjon? For å svare på dette spørsmålet, la oss lære fordelene på høyere nivå som en meldingsmegler tilbyr:

  • Forenklet frakobling - En meldingsmegler eliminerer avhengighetene mellom applikasjoner. En meldingsmegler fungerer som mellommann mellom en klient og serveren. Det er serverens arbeid å sende data til en megler. En server trenger ikke å være i direkte kontakt med meldingsmottakeren. Når klienten trenger dataene, får den bare meldingene fra megleren når som helst. Det er ikke avgjørende å bruke en oppdagelsesmetodikk for å identifisere plasseringen av serverforekomster. Meldingsmegleren tar seg av disse situasjonene.

  • Økt arkitektonisk pålitelighet - Serveren kan sende meldinger uansett om klienten er aktiv eller ikke og omvendt. Den eneste komponenten som må kjøres er en meldingsmegler. Når en server sender meldinger, er jobben gjort. Det er nå meglerens arbeid å levere meldingene til de riktige mottakerne.

  • Asynkron prosessering - Anta at du kjører en Node.js fullskala API ved å bruke REST-arkitekturen. Serveren og klienten er tett koblet sammen for å lage forespørsler og svar og utveksle data. De to kommuniserer direkte ved å bruke utpekte endepunkter basert på HTTP-protokollen. Det som skjer her er at hvis klienten sender en forespørsel, forventer den et øyeblikkelig svar fra serveren. En REST-kommunikasjon er synkront utformet. Det fungerer med forhåndsdefinerte forespørsler som må returnere et svar. Hvis svaret mislykkes, kan det oppstå uønskede brukeropplevelser, for eksempel en tidsavbruddsfeil. På den andre siden er meldingsmeglere asynkrone. Ingen må vente. Tidsavbruddsfeil kan aldri forekomme i slike arkitekturer.

Hvordan gagner dette Node.js-appene dine?

  • Forbedret systemytelse - Meldingsmeglere bruker meldingskøer for asynkron kommunikasjon. Høy-etterspørselsprosesser kan isoleres til uavhengige prosesser. Dette sikrer at dataoverføringen er optimalisert ettersom ingen systemkomponent noen gang holdes oppe mens du venter på den andre. Det vil bidra til å akselerere applikasjonsytelsen og forbedre brukeropplevelsen.

  • Skalerbarhet - Serveren og klienten kan alle utvide og trekke seg sammen som svar på datakrav. Komponenter kan fortsette å legge til oppføringer i køen selv når etterspørselen topper uten å frykte systemkrasj. På samme måte kan klienter skaleres opp og arbeidsmengden fordeles basert på innkommende data.

Gode ​​eksempler på meldingsmeglere finnes i denne repoen, og en ny jeg nylig fant er Memphis. Det passer utmerket for node.js/typescript/NestJS (Les mer her [Memphis SDK-er for Node.js/Typescript] https://docs.memphis.dev/memphis-new/sdks/node.js-typescript) ) med en moderne dev-first-tilnærming.

2. Bygg Node.js med gRPC

gRPC er et RPC-rammeverk (Remote Procedure Call) med åpen kildekode som brukes til å bygge skalerbare mikrotjenester for rask kommunikasjon. Det hjelper deg med å lage en kommunikasjonsprotokoll med høy ytelse mellom tjenester. Et RPC-rammeverk bruker en klient til å starte en funksjon på serveren direkte. Enkelt sagt er RPC en protokoll som lar et program utføre en prosedyre for et annet program som ligger på en annen datamaskin uten eksplisitt å kode detaljene i nettverksinteraksjonen. Det håndteres automatisk av det underliggende rammeverket.

Hva gjør gRPC-rammeverket spesielt?

  • Den bruker HTTP/2-protokollen. Arkitekturer som REST bruker den tradisjonelle HTPP 1.1 som overføringsprotokoll. Denne protokollen er basert på en forespørsel-svar-modell som bruker generiske HTTP-metoder, som GET, POST, PUT og DELETE. Hvis mange klienter sender inn forespørsler, blir de akseptert én om gangen. HTTP/2-protokollen støtter en toveis kommunikasjonsmodell sammen med forespørsel-svar-modellen. Det er mulig å betjene flere forespørsler og svar samtidig. Dette skaper en løs kobling mellom server og klient, slik at du kan bygge raske og effektive applikasjoner som støtter strømming med lav ventetid.

  • Den bruker protokollbuffere (protobuf) som meldingsformat. Når du utveksler data ved hjelp av en SOAP-protokoll, skjer utvekslingen av informasjon over XML. Når du bruker REST, utveksles dataene i JSON-format. I gRPC utveksles data over protokollbuffere. Protokollbuffere er lette, raskere og effektive sammenlignet med både XML og JSON. Den har færre nyttelast. Under panseret utfører den serialisering av de strukturerte dataene. Protobuf-kompilatoren gjør datastrukturen til det binære protobuf-formatet, som brukes til å beskrive kommunikasjonsformatet mellom klienten og serveren.

  • Språkagnostisk - Flertallet av moderne språk og rammeverk støtter i stor grad gRPC, som Node.js, Python, Go Java, PHP og C#. En klient og serveren kan bygges med forskjellige språk/rammer. Det er mer fleksibelt enn konvensjonelle API-er siden klienter kan bruke hvilken som helst funksjon, ikke bare de typiske GET-, POST- og DELETE-metodene.

Hvordan nytter applikasjonen din å kjøre Node.js med gRPC:

  • Raskere kommunikasjon - gRPC bruker HTTP/2. Dette minimerer ventetid og bruk av nettverksbåndbredde for å sikre en jevnere brukeropplevelse. Samtidig er den API-drevet, noe som gir deg fleksibilitet i grensesnittdesign.

  • Økt applikasjonsytelse - REST bruker synkrone anrop. Dette sikrer at serveren har returnert et svar før kjøringen fortsetter. Imidlertid returnerer gRPC asynkrone spørringer umiddelbart, og svaret behandles som en uavhengig oppgave.

  • Lette meldinger – Protokollbuffere anses som mindre sammenlignet med JSON-meldinger med en forskjell på opptil 30 prosent

gRPC og Message Brokers hjelper deg med å håndtere og administrere applikasjonsmeldingene dine. Sjekk hvordan gRPC er sammenlignet med Message Broker.

3. Optimalisering av Node.js med klynging

Node.js er entrådet. Den bruker bare én CPU for å kjøre en applikasjon som standard. Dette betyr at hvis du har 8 CPUer på maskinen din, skapes Node.js-tråder for å kun bruke én CPU selv når du utfører CPU-intensive operasjoner. Dette hindrer applikasjonen i å utnytte den fulle kraften de underliggende bare metaller har, noe som kan føre til en fastlåst serversituasjon.

For å løse dette bruker Node.js klynger. En klynge er en gruppe nodeforekomster som kjører på en datamaskin. I dette tilfellet bruker Node.js hoved-CPU som sin hovedforekomst og andre tilgjengelige CPUer som arbeiderforekomster.

Node.js-klynger lar nettverksbaserte Node.js-applikasjoner skaleres over antall tilgjengelige CPUer. Her er et grunnleggende eksempel på nodeclustering.

Bildekilde

Denne datamaskinen har 4 prosessorer. Som standard vil Node.js sin entrådede natur bare bruke én CPU. Imidlertid kan vi skape oppgaver på tvers av tilgjengelige CPUer ved å bruke Node.js-klyngemodulen under panseret. Node.js kan kjøre den underordnede prosessen og dele serverportene mens de fortsatt kan kommunisere med den overordnede Node-prosessen. Avhengig av antall CPUer som leveres, øker det ytelsen, effektiviteten og påliteligheten til applikasjonen din betraktelig.

4. Lastbalansering

La oss anta at du har en nettapp, en nettbutikk for å være spesifikk. Brukere får tilgang til butikken din ved å bruke et domenenavn. Dette domenet vil kommunisere med serveren for å få ting gjort på brukerens side. Men når du har stor trafikk til nettbutikken din, vil etterspørselen etter ressurser øke.

Du kan bli bedt om å sette opp en ekstra server for å distribuere trafikken. En situasjon som vil gjøre at du har flere kopier av søknaden din. Men hvordan instruerer du brukerne til å bruke ressursene fra replikaservere? Hvis de alle kobler seg til den opprinnelige serveren, vil du gå tom for ressurser, og etterlate deg med andre instansservere ubrukte.

På dette tidspunktet trenger du å balansere trafikken for å få tilgang til alle servere. Og det du akkurat gjør er lastbalansering for å fordele trafikken jevnt. Dette gir en optimal ytelse av applikasjonen din og sikrer at ingen noder blir overbelastet.

Bildekilde

Lastbalansering er en prosess for å distribuere applikasjonsoppgaver innenfor et gitt sett med ressurser for å sikre effektiv brukbarhet av de totale ressursene. På denne måten blir alle klientforespørslene dine jevnt og likt fordelt til backend-nodene som administrerer applikasjonen din.

Det er viktig å ha en lastbalanser konfigurert til Node.js for å skalere distribusjonen din basert på ressursbehovet. Et av de populære verktøyene som brukes til å distribuere lastbalansering i Node.js er NGINX. Nginx er et åpen kildekode-verktøy som lar deg konfigurere HTTP- og HTTPS-servere for klienttrafikken.

Bildekilde

Ved å forstyrre trafikken kan en lastbalanser forhindre applikasjonsfeil og øke ytelsen og tilgjengeligheten. Hvordan fordeler applikasjonen din å bygge Node.js-distribuerte systemer med en lastbalanser?

  • Horisontal skalerbarhet – Ved å distribuere applikasjonsforekomsten din kan den administrere en bredere mengde innkommende forespørsler.

  • Redusert servernedetid

  • Fleksibilitet

  • Redundans

  • Effektivitet

5. Buffer

Caching er midlertidig lagring av data som sannsynligvis vil få tilgang til gjentatte ganger. Denne praksisen bruker en minnebuffer for å lagre applikasjonsoppslag midlertidig.

En hurtigbuffer effektiviserer tjenesteleveransen ved å sikre at enhver repeterende oppgave ikke hentes fra serveren, men en minnebuffer. På denne måten, hvis en forespørsel kommer fra klienten, vil den først sjekke eventuelle oppslag som er lagret i hurtigbufferen uten å treffe serveren.

Bildekilde

Når du kjører en server som leverer ofte etterspurte ressurser fra samme forespørsel, øker det dataforsinkelser til klientene. Ved å betjene slike beregninger fra et hurtigbufferlag kan du levere data og svare på forespørsler med minimale forsinkelser.

Bildekilde

Første gang en forespørsel sendes og et anrop til serveren kalles en cache-miss. Utdataene vil bli lagret i hurtigbufferen før dataene returneres til brukeren.

Bildekilde

Hvis de forespurte dataene blir funnet i hurtigbufferminnet, kalles det et hurtigbuffertreff. Resultatet vil bli returnert fra bufferlageret og den komplekse dataspørringen trenger ikke å behandles på nytt.

Bildekilde

Det er viktig å alltid sjekke cache-treffratene og polere cachestrategien deretter. Et hurtigbufferlag er ikke uendelig. Derfor trenger du effektiv cache-administrasjon. For eksempel:

  • Ugyldig cache etter en viss periode.

  • Fjerner cache for å sikre at caching hit ratio forblir høy.

  • Ugyldiggjør en hurtigbuffer under visse bruksgrenser.

Distribuerte systemer må fullføre mange API-kall for å matche en enkelt respons nyttelast. Å kjøre slike samtaler med en cache reduserer drastisk kostnadene ved dataaggregering. Å kjøre slike Node.js-oppgavebufring kan:

  • Reduser responstiden for dataspørringer betydelig.

  • Forbedre skalerbarheten til en applikasjon.

  • Redusert serverbelastning som øker serverytelsen betraktelig.

  • Bufring forbedrer databaseytelsen. En bufret forespørsel trenger ikke å treffe serveren, noe som betyr at dataforespørselen ikke trenger tilgang til databaselaget ditt.

Node.js-bufringsverktøy inkluderer:

  • Redis cache. Redis bruker en database i minnet for å lagre hele datasettet, noe som reduserer ekstrakostnadene ved et oppslag.

  • Bruke caching omvendt proxy, for eksempel Varnish Cache. Vanish er et HTTP-akseleratorverktøy som lar deg lagre forespørsler og svar på serversiden for å redusere lastetidene til Node.js-serveren.

  • Bruker Node.js App server HTTP Cache Middleware. Den lar deg legge til en Cache-mellomvare som kobles til Node.js HTTP for å redusere API-forsinkelse.

  • Bruker Nginx for innholdsbufring. Nginx cacher innhold på applikasjonsservere, både statisk og dynamisk, for å strømlinjeforme klientleveransen og redusere serverbelastningen.

Andre fremgangsmåter for å slå på Node.js-appen din

Det er mange praksiser du kan bruke og sikre at Node.js skalerer din
applikasjon. Andre praksiser og verktøy inkluderer:

  • Øver på asynkrone kjøringer.

  • Logger og overvåker applikasjonsytelsen din.

  • Skrive lett og kompakt kode og sikre at du eliminerer linjer med koder og ubrukte bibliotekkomponenter.

  • Øver på minneoptimalisering

  • Kjører Node.js med SSL/TLS og HTTP/2.

  • Forbedring av datahåndteringsteknikker, for eksempel GraphQL vs. REST-design.

  • Bruke Web Sockets for å forbedre serverkommunikasjonen.

  • Bruk Node.js Deflate og Gzip komprimeringsmiddelvare for å komprimere serverforespørsler og svar.

Konklusjon

Å bygge en applikasjon er det første trinnet for å komme i kontakt med brukerne dine. Applikasjonen din krever daglig vedlikehold for å opprettholde en jevn opplevelse for disse brukerne. Denne veiledningen hjalp deg med å lære noen av de vanlige strategiene og forbedringsverktøyene du kan bruke for å øke Node.js-appene dine.