Cunoaștem Node.js pentru performanțele sale ultrarapide. Cu toate acestea, ca în cazul oricărui limbaj, puteți scrie cod Node.js care are performanțe mai slabe pentru utilizatorii dvs. decât v-ați dori. Pentru a combate acest lucru, avem nevoie de teste de performanță adecvate. Astăzi, vom acoperi exact acest aspect cu o privire în profunzime asupra modului de a configura și rula un test de performanță și de a analiza rezultatele, astfel încât să puteți realiza aplicații Node.js ultrarapide.

Cel mai bun mod de a înțelege cum să testați performanța aplicației dvs. este să parcurgeți un exemplu.

Puteți utiliza Node.js în mai multe scopuri: scrierea de scripturi pentru rularea sarcinilor, rularea unui server web sau servirea de fișiere statice, cum ar fi un site web. Astăzi, vom parcurge pașii pentru a testa o API web Node.js HTTP. Dar dacă construiți altceva în Node, nu vă faceți griji – multe dintre principii vor fi similare.

Natura unică a performanței Node.js

Înainte de a începe, haideți să aruncăm o privire rapidă asupra uneia dintre cele mai unice caracteristici ale performanței Node.js. Vom avea nevoie să cunoaștem aceste caracteristici mai târziu, atunci când vom rula testele noastre de performanță.

Despre ce vorbesc?

Cel mai important aspect de luat în considerare pentru aplicațiile Node.js este comportamentul lor cu un singur fir, de execuție până la finalizare – facilitat de ceea ce este cunoscut sub numele de bucla de evenimente. Acum, știu la ce vă gândiți: asta este mult. Așa că haideți să le împărțim puțin pentru a înțelege ce înseamnă acestea.

Să începem cu single threading. Threading-ul, ca și concept, permite procesarea concurentă în cadrul unei aplicații. Node.js nu are această capacitate, cel puțin nu în sensul tradițional. În schimb, pentru a scrie aplicații care execută mai multe sarcini în același timp, avem codul asincron și bucla de eveniment.

Bucla de eveniment

Ce este bucla de eveniment?

Bucla de eveniment este modul în care Node.js împarte procesele de lungă durată în bucăți mici. Funcționează ca o bătaie de inimă: La fiecare câteva milisecunde, Node.js va verifica o coadă de lucru pentru a începe sarcini noi. Dacă există treabă, le va aduce pe acestea în stiva de apeluri și apoi le va rula până la finalizare (vom vorbi în curând despre run-to-completion).

Prin împărțirea sarcinilor, Node.js poate face mai multe sarcini, care este înlocuitorul vostru pentru threading. Aceasta înseamnă că, în timp ce o sarcină așteaptă, o alta poate începe. Așadar, mai degrabă decât threading, folosim cod asincron, facilitat de stiluri de programare precum callback-uri, promisiuni și async/await. Majoritatea API-urilor Node out-of-the-box au atât o metodă de execuție sincronă, cât și una asincronă.

Bine, deci poate vă întrebați: ce legătură au toate aceste cuvinte tehnice cu performanța?

Lăsați-mă să vă explic…

Performanța Node.js și bucla de evenimente

Imaginați-vă că construiți o aplicație Node.js cu două puncte finale: unul pentru încărcarea fișierelor și unul care preia un profil de utilizator. API-ul pentru profilul utilizatorului va fi probabil solicitat semnificativ mai des decât încărcarea fișierelor și, dacă nu răspunde suficient de repede, va bloca fiecare încărcare a paginii pentru fiecare utilizator – ceea ce nu este bine.

Apif-ul de încărcare a utilizatorilor este utilizat rar. De asemenea, utilizatorii se așteaptă ca încărcarea sarcinilor să dureze, dar sunt mult mai puțin iertători cu timpii de încărcare a paginilor. Dacă nu programăm cu bucla de eveniment în minte, în timp ce fișierul se încarcă, Node.js ar putea ajunge să acapareze toate resursele sistemului și ar putea bloca alți utilizatori să vă folosească aplicația – uh-oh!

Și de aceea trebuie să înțelegeți natura single-threaded a Node.js. Pe măsură ce ne modificăm aplicația, trebuie să luăm în considerare acest comportament. Vrem să evităm să facem sarcini de lungă durată în mod sincron, cum ar fi efectuarea de cereri de rețea, scrierea de fișiere sau efectuarea unui calcul greu.

Acum știm despre natura single-threaded a lui Node.js, o putem folosi în avantajul nostru. Haideți să vedem pas cu pas cum puteți configura, rula și analiza un test de performanță al aplicației dvs. Node.js pentru a vă asigura că faceți tot posibilul pentru a valorifica capacitățile de performanță Node.js.

Pasul 1: Alegerea instrumentului de testare a performanței Node.js

În primul rând, veți dori să alegeți un instrument care vă va permite să rulați testele de performanță. Există multe instrumente, toate cu argumente pro și contra diferite pentru reglarea performanței Node.js. Un lucru principal de luat în considerare este că, chiar dacă testați o aplicație Node.js, dacă aveți de gând să testați performanța din lumea exterioară printr-o rețea, nu contează dacă instrumentul dvs. de testare a performanței este scris în Node.js.

Pentru testarea de bază a performanței HTTP, îmi place Artillery, un instrument de testare a performanței direct scris în Node.js. Este, de asemenea, deosebit de bun pentru a rula teste de performanță pentru cererile API. Artillery funcționează prin scrierea unui fișier de configurare care definește profilul dvs. de încărcare. Îi spuneți lui Artillery ce puncte finale doriți să solicitați, la ce rată, pentru ce durată etc.

Un script de testare de bază arată astfel:

config: target: 'https://artillery.io' phases: - duration: 60 arrivalRate: 20 defaults: headers: x-my-service-auth: '987401838271002188298567'scenarios:- flow:- get:url: "/docs"

Aici, solicitați site-ul web al Artillery pentru o durată de 60 de secunde, cu 20 de utilizatori noi care sosesc la URL.

Apoi, pentru a rula testul, executați pur și simplu:

artillery run your_config.yml

Artillery va face atâtea cereri către aplicația dvs. câte i-ați instruit. Acest lucru este util pentru a construi profiluri de testare a performanțelor care imită mediul dvs. de producție. Ce înțeleg prin profil de testare a performanței? Să abordăm asta acum.

Pasul 2: Creați un profil de test de performanță Node.js

Un profil de test de performanță, ca mai sus, este o definiție a modului în care se va desfășura testul dumneavoastră de performanță. Veți dori să imitați modul în care traficul dvs. de producție se comportă sau se așteaptă să se comporte, dacă este posibil, pentru a face un reglaj precis al performanței Node.js. De exemplu, dacă construiți un site web de evenimente, v-ați aștepta la mult trafic în jurul momentului în care eliberați bilete, așa că ați dori să construiți un profil care să imite acest comportament. Ați dori să testați capacitatea aplicației dvs. de a se adapta la un volum mare de încărcare într-un timp scurt. Alternativ, dacă gestionați un site de comerț electronic, v-ați putea aștepta la un trafic uniform. În acest caz, profilurile dvs. de testare a performanței ar trebui să reflecte acest comportament.

Valorificarea mai multor profiluri de testare

Un aspect amuzant și interesant de reținut este faptul că puteți crea diferite profiluri de testare și le puteți rula într-un mod suprapus. De exemplu, ați putea crea un profil care să imite nivelul dvs. de trafic de bază – să zicem, 100 de solicitări pe minut – și apoi să imite ceea ce s-ar putea întâmpla dacă ați vedea un trafic mare pe site-ul dvs., să zicem dacă ați plasat niște reclame în motoarele de căutare. Testarea mai multor scenarii este importantă pentru o reglare temeinică a performanțelor Node.js.

Replicarea sistemelor distribuite pe scară largă

Trebuie să mă opresc o secundă aici pentru a remarca ceva: Când o aplicație ajunge la o anumită dimensiune, mimarea încărcării în acest mod își pierde fezabilitatea. Volumele de trafic pe care le puteți avea ar putea fi atât de sălbatice, imprevizibile sau cu un volum atât de mare încât este greu să creați o modalitate realistă, similară, de a testa aplicația înainte de lansare.

Dar ce se întâmplă dacă acesta este cazul? Ce trebuie să facem? Testăm în producție.

S-ar putea să vă gândiți: „Woah, stați puțin! Nu ar trebui să testăm înainte de lansare?”

Poate că da, dar când un sistem ajunge la o anumită dimensiune, ar putea avea sens să valorificăm diferite strategii de testare a performanței. Puteți valorifica concepte precum eliberarea canarului pentru a vă lansa modificările în producție și a le testa doar cu un anumit procent de utilizatori. Dacă observați o scădere a performanței, puteți să schimbați traficul înapoi la implementarea anterioară. Acest proces încurajează cu adevărat experimentarea, iar cea mai bună parte este că testați pe aplicația dvs. reală de producție, deci nu vă faceți griji că rezultatele testelor nu imită producția.

Până acum am decis asupra instrumentelor noastre și am creat profiluri care recreează producția noastră, cum ar fi traficul și sarcinile de lucru. Ce trebuie să facem în continuare? Trebuie să ne asigurăm că avem datele de care avem nevoie pentru a ne analiza aplicația, iar acest lucru îl facem prin intermediul instrumentelor de monitorizare a performanței Node.js și de gestionare a performanței aplicațiilor (APM). Ce este un APM? Citiți mai departe și vă voi spune!

Pasul 3: Configurați observabilitatea/monitorizarea

Nu vrem doar să rulăm testul nostru de performanță împotriva aplicației noastre și să sperăm și să ne rugăm. Dacă o facem, nu vom fi capabili să înțelegem cum se comportă și dacă face ceea ce credem că ar trebui să facă. Așadar, înainte de a începe, ar trebui să ne punem întrebări de genul: „Pentru aplicația mea, cum arată o performanță bună? Care sunt SLA-urile și KPI-urile mele? Ce măsurători sunt necesare pentru a depana în mod eficient o problemă de performanță?”

Dacă aplicația dvs. funcționează lent sau diferit de ceea ce vă așteptați, veți avea nevoie de date pentru a înțelege de ce, astfel încât să o puteți îmbunătăți. Toate aplicațiile de producție demne de luat în seamă folosesc o anumită formă de observabilitate și/sau o soluție de monitorizare. Aceste instrumente, adesea numite APM-uri, vă permit să vizualizați parametrii critici de performanță Node.js cu privire la aplicația dvs. în curs de execuție.

Noțiuni de bază pentru a începe să funcționeze cu un APM

APM-urile vin în diferite forme și mărimi, toate cu diferite caracteristici, etichete de preț, implicații de securitate, performanță, orice doriți. Merită să faceți câteva cumpărături pentru a găsi cel mai bun instrument pentru nevoile dumneavoastră. Aceste instrumente sunt cele care ne vor oferi perspectivele și datele de care avem nevoie atunci când executăm testele noastre de performanță Node.js.

Dacă știm că ar trebui să monitorizăm aplicația noastră – ce anume ar trebui să monitorizăm?

În mod normal, doriți cât mai multe date posibil – dar, oricât de mult ne plac datele; trebuie să fim realiști cu privire la locul de unde să începem! Cel mai bun loc pentru a începe este cu următoarele trei domenii:

  • Jurnalele agregate – Jurnalele aplicațiilor emise fie implicit de unele biblioteci, fie explicit de către un dezvoltator pentru a obține o perspectivă asupra unei aplicații. Majoritatea instrumentelor de jurnale agregate vă permit să căutați și să vizualizați cu ușurință datele înregistrate. În cazul nostru, am putea să înregistrăm în jurnal performanța fiecăruia dintre API-urile noastre și să le reprezentăm pe un grafic.
  • Informații despre infrastructură-Aplicația dvs. va rula pe o gazdă de diferite tipuri, așa că probabil veți dori să vedeți toate datele. Dacă rulați în cloud, majoritatea furnizorilor vă oferă aceste date (chiar dacă într-o formă brută) din start. Datele pe care le veți obține de la aceste instrumente vor acoperi lucruri cum ar fi utilizarea CPU și a memoriei gazdei, date de conectare etc.
  • Monitorizarea aplicației – Acest tip de instrument se află de obicei în codul aplicației dvs. și poate extrage informații despre modul în care funcțiile se execută/sunt apelate, ce erori aruncăm etc.

Câteva instrumente APM, cum ar fi Retrace, au toate sau majoritatea acestor trei caracteristici reunite într-una singură, în timp ce altele pot fi mai specializate. În funcție de cerințele dumneavoastră, este posibil să doriți un instrument care să facă totul sau o gamă întreagă de instrumente pentru diferite scopuri.

Instrumente adaptate la Node.js

Pe lângă instrumente, putem include și alte instrumente și profilatoare specifice Node.js, cum ar fi graficele de flacără, care analizează execuția funcțiilor noastre sau extrag date despre execuția buclelor de evenimente. Pe măsură ce vă familiarizați mai bine cu testarea performanței Node.js, cerințele dvs. pentru date vor crește. Veți dori să continuați să faceți cumpărături, să experimentați și să vă actualizați uneltele pentru a vă înțelege cu adevărat aplicația.

Acum ne-am configurat uneltele, am obținut profiluri realiste pentru performanța noastră și am înțeles performanța aplicației noastre, suntem aproape gata să ne rulăm testele. Dar înainte de a face acest lucru, mai este un pas: crearea infrastructurii de testare.

Pasul 4: Creați infrastructura de testare a performanței Node.js

Puteți rula testele de performanță de pe propria mașină dacă doriți, dar există probleme în a face acest lucru. Până acum, am încercat din răsputeri – cu profilurile noastre de testare, de exemplu – să ne asigurăm că testele noastre de performanță se replică. Un alt factor în replicarea testelor noastre este acela de a ne asigura că le rulăm întotdeauna pe aceeași infrastructură (a se citi: mașină).

Una dintre cele mai simple modalități de a obține o infrastructură de testare consistentă este de a profita de găzduirea în cloud. Alegeți o gazdă/mașină de pe care doriți să vă lansați testele și asigurați-vă că de fiecare dată când rulați testele este întotdeauna de pe aceeași mașină – și, de preferință, din aceeași locație, de asemenea – pentru a evita distorsionarea datelor pe baza latenței de solicitare.

Este o idee bună să faceți un script pentru această infrastructură, astfel încât să o puteți crea și desființa după cum și când este necesar. Ei numesc această idee „infrastructură ca și cod”. Majoritatea furnizorilor de cloud o suportă în mod nativ, sau puteți folosi un instrument precum Terraform pentru a vă ajuta.

Uf! Am acoperit o mulțime de teren până acum și am ajuns la pasul final: rularea testelor noastre.

Pasul 5: Rulați testele!

Ultimul pas este de a rula efectiv testele noastre. Dacă pornim configurația liniei noastre de comandă (așa cum am făcut la pasul 1), vom vedea cereri către aplicația noastră Node.js. Cu ajutorul soluției noastre de monitorizare, putem verifica modul în care se desfășoară bucla noastră de evenimente, dacă anumite cereri durează mai mult decât altele, dacă conexiunile se termină la timp etc.

Cireașa de pe tort pentru testele dvs. de performanță este să luați în considerare introducerea lor în pipeline-ul dvs. de compilare și testare. O modalitate de a face acest lucru este să vă rulați testele de performanță peste noapte, astfel încât să le puteți revizui în fiecare dimineață. Artillery oferă o modalitate simplă și plăcută de a crea aceste rapoarte, care vă poate ajuta să depistați orice regresie de performanță Node.js.

Acum aveți Node.js rapid ca fulgerul

Aceasta este o concluzie.

Astăzi, am acoperit relevanța buclei de evenimente pentru performanța aplicației dvs. JavaScript, cum să vă alegeți instrumentele de testare a performanței, cum să configurați profiluri de testare a performanței consistente cu Artillery, ce monitorizare veți dori să configurați pentru a diagnostica Node.js probleme de performanță și, în cele din urmă, cum și când să rulați testele de performanță pentru a obține cea mai mare valoare pentru dumneavoastră și echipa dumneavoastră.

Experimentați cu instrumente de monitorizare, cum ar fi Retrace APM pentru Node.js, faceți schimbări mici, astfel încât să puteți testa impactul schimbărilor și revizuiți frecvent rapoartele de testare, astfel încât să puteți detecta regresiile. Acum aveți tot ce vă trebuie pentru a profita de capacitățile de performanță Node.js și pentru a scrie o aplicație superperformantă pe care utilizatorii dvs. să o adore!

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.