Tunnemme Node.js:n sen salamannopeasta suorituskyvystä. Silti, kuten minkä tahansa kielen kohdalla, voit kirjoittaa Node.js-koodia, joka toimii käyttäjien kannalta huonommin kuin haluaisit. Tämän torjumiseksi tarvitaan riittävää suorituskykytestausta. Tänään käsittelemme juuri tätä tarkastelemalla perusteellisesti, miten suorituskykytesti asetetaan ja ajetaan sekä analysoidaan tuloksia, jotta voit tehdä salamannopeita Node.js-sovelluksia.
Paras tapa ymmärtää, miten sovelluksesi suorituskykytestausta tehdään, on käydä läpi esimerkki.
Node.js:ää voi käyttää moniin tarkoituksiin: voit kirjoittaa skriptejä tehtävien suorittamiseen, pyörittää web-palvelinta tai palvella staattisia tiedostoja, kuten verkkosivustoa. Tänään käymme läpi vaiheet Node.js:n HTTP-verkkoliitännän testaamiseksi. Mutta jos rakennat jotain muuta Nodella, älä huoli – monet periaatteet ovat samankaltaisia.
- Node.js:n suorituskyvyn ainutlaatuinen luonne
- Tapahtumasilmukka
- Node.js:n suorituskyky ja tapahtumasilmukka
- Vaihe 1: Node.js:n suorituskykytestityökalun valinta
- Vaihe 2: Luo Node.js-suorituskykytestiprofiili
- Useiden testiprofiilien hyödyntäminen
- Suurten hajautettujen järjestelmien kopiointi
- Vaihe 3: Määritä tarkkailtavuus/seuranta
- APM:n käyttöönotto
- Node.js:lle räätälöityjä työkaluja
- Vaihe 4: Node.js-suorituskykytesti-infrastruktuurin luominen
- Vaihe 5: Suorita testit!
- Nyt sinulla on salamannopea Node.js
Node.js:n suorituskyvyn ainutlaatuinen luonne
Ennen kuin aloitamme, tarkastellaan lyhyesti yhtä Node.js:n suorituskyvyn ainutlaatuisimmista ominaisuuksista. Tarvitsemme tietoa näistä ominaisuuksista myöhemmin, kun suoritamme suorituskykytestejämme.
Mitä tarkoitan?
Node.js-sovellusten tärkeä näkökohta on niiden yksisäikeinen, suorituksesta loppuun käyttäytyminen – jota helpottaa niin sanottu tapahtumasilmukka. Tiedän, mitä ajattelet: tuo on paljon. Joten jaetaanpa tätä hieman, jotta ymmärrämme, mitä nämä tarkoittavat.
Aloitetaan yksisäikeisyydestä. Säikeistäminen käsitteenä mahdollistaa samanaikaisen käsittelyn sovelluksessa. Node.js:ssä ei ole tätä kykyä, ainakaan perinteisessä mielessä. Sen sijaan sellaisten sovellusten kirjoittamiseen, jotka suorittavat useita tehtäviä kerralla, meillä on asynkroninen koodi ja tapahtumasilmukka.
Tapahtumasilmukka
Mikä on tapahtumasilmukka?
Tapahtumasilmukka on Node.js:n tapa pilkkoa pitkäkestoisia prosesseja pieniin palasiin. Se toimii kuin sydämen syke: Muutaman millisekunnin välein Node.js tarkistaa työjonon aloittaakseen uusia tehtäviä. Jos työtä on, se tuo nämä kutsupinoon ja ajaa ne sitten loppuun asti (puhumme pian run-to-completionista).
Tehtävien pilkkomisen ansiosta Node.js voi tehdä monitehtäviä (multi-task), mikä on säikeistyksen korvike. Se tarkoittaa, että yhden tehtävän odottaessa toinen tehtävä voi käynnistyä. Säikeistämisen sijaan käytämme siis asynkronista koodia, jota helpottavat ohjelmointityylit, kuten callbackit, lupaukset ja async/await. Useimmissa valmiissa Node API:issa on sekä synkroninen että asynkroninen suoritustapa.
Okei, ehkä ihmettelet: mitä tekemistä tällä kaikella tällä teknojargonilla on suorituskyvyn kanssa?
Annahan kun selitän…
Node.js:n suorituskyky ja tapahtumasilmukka
Kuvittele, että rakennat Node.js-sovellusta, jossa on kaksi päätepistettä: toinen tiedostojen lataamista varten ja toinen käyttäjäprofiilin hakemista varten. Käyttäjäprofiili-API:tä pyydetään todennäköisesti huomattavasti useammin kuin tiedostojen latausta, ja jos se ei vastaa tarpeeksi nopeasti, se estää jokaisen käyttäjän jokaisen sivun latauksen – ei hyvä.
Käyttäjäprofiilin lataus-API:tä käytetään harvoin. Käyttäjät myös odottavat, että tehtävien lataaminen vie aikaa, mutta he ovat paljon anteeksiantamattomampia sivun latausaikojen suhteen. Jos emme ohjelmoi tapahtumasilmukkaa silmällä pitäen, kun tiedostoa ladataan, Node.js voi päätyä haalimaan kaikki järjestelmän resurssit ja estää muita käyttäjiä käyttämästä sovellustasi-uh-oh!
Ja siksi sinun on ymmärrettävä Node.js:n yksisäikeinen luonne. Kun muutamme sovellustamme, meidän on otettava tämä käyttäytyminen huomioon. Haluamme välttää pitkäkestoisten tehtävien tekemistä synkronisesti, kuten verkkopyyntöjen tekemistä, tiedostojen kirjoittamista tai raskaiden laskutoimitusten suorittamista.
Nyt kun tiedämme Node.js:n yksisäikeisen luonteen, voimme käyttää sitä hyväksemme. Käydään askel askeleelta läpi, miten voit määrittää, suorittaa ja analysoida Node.js-sovelluksesi suorituskykytestin varmistaaksesi, että teet parhaasi Node.js:n suorituskykyominaisuuksien hyödyntämiseksi.
Vaihe 1: Node.js:n suorituskykytestityökalun valinta
Ensiksi haluat valita työkalun, jonka avulla voit suorittaa suorituskykytestit. Tarjolla on monia työkaluja, joilla kaikilla on erilaisia etuja ja haittoja Node.js:n suorituskyvyn virittämiseen. Yksi tärkeimmistä huomioon otettavista asioista on se, että vaikka testaat Node.js-sovellusta, jos aiot suorittaa suorituskykytestauksen ulkomaailmasta verkon yli, ei ole väliä sillä, onko suorituskykytestaustyökalusi kirjoitettu Node.js:llä.
Perus HTTP-suorituskykytestaukseen pidän Artillerystä, joka on suoraviivainen suorituskykytestaustyökalu, joka on kirjoitettu Node.js:llä. Se on myös erityisen hyvä API-pyyntöjen suorituskykytestien suorittamisessa. Artillery toimii kirjoittamalla konfiguraatiotiedoston, joka määrittelee kuormitusprofiilin. Kerrot Artillerylle, mitä päätepisteitä haluat pyytää, millä nopeudella, millä kestolla jne.
Perustestiskripti näyttää tältä:
config: target: 'https://artillery.io' phases: - duration: 60 arrivalRate: 20 defaults: headers: x-my-service-auth: '987401838271002188298567'scenarios:- flow:- get:url: "/docs"
Tässä pyydät Artilleryn verkkosivua 60 sekunnin ajan, jolloin URL-osoitteeseen saapuu 20 uutta käyttäjää.
Testiä suorittaaksesi suoritat yksinkertaisesti:
artillery run your_config.yml
Artillery tekee sovelluksellesi niin monta pyyntöä kuin olet antanut sille ohjeet. Tämä on hyödyllistä rakennettaessa suorituskykytestiprofiileja, jotka jäljittelevät tuotantoympäristöäsi. Mitä tarkoitan suorituskykytestiprofiililla? Käsitellään se nyt.
Vaihe 2: Luo Node.js-suorituskykytestiprofiili
Suorituskykytestiprofiili, kuten edellä, on määritelmä siitä, miten suorituskykytestisi suoritetaan. Haluat jäljitellä, miten tuotantoliikenteesi käyttäytyy tai sen odotetaan käyttäytyvän, jos mahdollista, jotta voit tehdä tarkkaa Node.js-suorituskyvyn viritystä. Jos esimerkiksi rakennat tapahtumasivustoa, odotat paljon liikennettä lippujen julkaisun aikaan, joten haluat rakentaa profiilin, joka jäljittelee tätä käyttäytymistä. Haluaisit testata sovelluksesi kykyä skaalautua suurille kuormitusmäärille lyhyessä ajassa. Vaihtoehtoisesti, jos käytät verkkokauppasivustoa, voit odottaa tasaista liikennettä. Tällöin suorituskykytestiprofiileidesi tulisi heijastaa tätä käyttäytymistä.
Useiden testiprofiilien hyödyntäminen
Hauska ja mielenkiintoinen seikka on, että voit luoda erilaisia testiprofiileja ja ajaa niitä päällekkäin. Voit esimerkiksi luoda profiilin, joka jäljittelee perusliikennetasoasi – vaikkapa 100 pyyntöä minuutissa – ja sitten jäljitellä, mitä voisi tapahtua, jos sivustollesi tulisi paljon liikennettä, vaikkapa jos laittaisit hakukonemainoksia. Useiden skenaarioiden testaaminen on tärkeää Node.js:n suorituskyvyn perusteellista virittämistä varten.
Suurten hajautettujen järjestelmien kopiointi
Minun on tässä kohtaa pakko huomauttaa jotain: Kun sovellus saavuttaa tietyn koon, kuormituksen matkiminen tällä tavalla menettää toteutettavuutensa. Liikennemäärät voivat olla niin hurjia, arvaamattomia tai suuria, että on vaikea luoda realistista samanlaista tapaa testata sovellusta ennen julkaisua.
Mutta entä jos näin on? Mitä me teemme? Testaamme tuotannossa.
Saatat ajatella: ”Hetkinen! Eikö meidän pitäisi testata ennen julkaisua?”
Voi, mutta kun järjestelmä saavuttaa tietyn koon, voi olla järkevää hyödyntää erilaisia suorituskykytestausstrategioita. Voit hyödyntää sellaisia käsitteitä kuin canary release, jolloin voit laittaa muutokset tuotantoon ja testata niitä vain tietyllä prosentilla käyttäjistä. Jos suorituskyky heikkenee, voit vaihtaa liikenteen takaisin aiempaan toteutukseen. Tämä prosessi todella rohkaisee kokeilemaan, ja parasta on se, että testaat oikealla tuotantosovelluksella, joten et ole huolissasi siitä, että testitulokset eivät jäljittelisi tuotantoa.
Tähän mennessä olemme päättäneet työkaluistamme ja luoneet profiileja, jotka jäljittelevät tuotantoa, kuten liikennettä ja työkuormia. Mitä teemme seuraavaksi? Meidän on varmistettava, että meillä on tiedot, joita tarvitsemme sovelluksemme analysoimiseksi, ja teemme sen Node.js-suorituskyvyn seurannan ja Application Performance Management (APM) -työkalujen avulla. Mikä on APM? Lue eteenpäin, niin kerron sinulle!
Vaihe 3: Määritä tarkkailtavuus/seuranta
Me emme halua vain ajaa suorituskykytestiämme sovellustamme vastaan ja toivoa ja rukoilla. Jos teemme niin, emme pysty ymmärtämään, miten se toimii ja tekeekö se sitä, mitä luulemme sen tekevän. Ennen kuin aloitamme, meidän on siis kysyttävä itseltämme esimerkiksi seuraavia kysymyksiä: ”Miltä hyvä suorituskyky näyttää minun sovelluksessani? Mitkä ovat SLA:t ja KPI:t? Mitä mittareita tarvitaan suorituskykyongelman tehokkaaseen vianmääritykseen?”
Jos sovelluksesi toimii hitaasti tai eri tavalla kuin odotit, tarvitset tietoja ymmärtääksesi miksi, jotta voit parantaa sitä. Kaikki arvokkaat tuotantosovellukset käyttävät jonkinlaista havainnointi- ja/tai seurantaratkaisua. Näiden työkalujen, joita kutsutaan usein APM:ksi, avulla voit tarkastella käynnissä olevan sovelluksesi kriittisiä Node.js-suorituskykymittareita.
APM:n käyttöönotto
APM:iä on erimuotoisia ja -kokoisia, ja niissä kaikissa on erilaisia ominaisuuksia, hintalappuja, tietoturvavaikutuksia, suorituskykyä ja niin edelleen. Kannattaa tehdä hieman ostoksia löytääksesi tarpeisiisi parhaiten sopivan työkalun. Juuri nämä työkalut antavat meille näkemyksiä ja tietoja, joita tarvitsemme, kun suoritamme Node.js-suorituskykytestejämme.
Jos tiedämme, että meidän pitäisi valvoa sovellustamme – mitä tarkalleen ottaen meidän pitäisi valvoa?
Todennäköisesti haluat mahdollisimman paljon tietoa – mutta niin paljon kuin rakastammekin dataa; meidän on oltava realistisia sen suhteen, mistä kannattaa aloittaa! Paras paikka aloittaa on seuraavat kolme aluetta:
- Aggregoidut lokit-sovelluksen lokit lähettävät joko implisiittisesti jotkin kirjastot tai eksplisiittisesti kehittäjä saadakseen käsityksen sovelluksesta. Useimmat aggregoidut lokityökalut mahdollistavat helpon haun ja visualisoinnin lokitiedoista. Meidän tapauksessamme voisimme lokata jokaisen API:n suorituskyvyn ja piirtää ne kuvaajaan.
- Infrastruktuurin oivallukset-Sovelluksesi toimii monenlaisessa isännässä, joten haluat todennäköisesti nähdä kaikki tiedot. Jos käytät pilvipalvelua, useimmat palveluntarjoajat antavat nämä tiedot (vaikkakin karkeassa muodossa) valmiiksi. Näistä työkaluista saamasi tiedot kattavat esimerkiksi isäntäkoneen suorittimen ja muistin käytön, yhteystiedot jne.
- Sovelluksen seuranta-Tyyppinen työkalu istuu yleensä sovelluskoodin sisällä, ja sen avulla voidaan saada tietoa siitä, miten funktiot toimivat/kutsutaan, mitä virheitä heitetään jne.
Joidenkin APM-työkalujen, kuten Retrace-työkalun, kaikki tai suurin osa näistä kolmesta piirteestä on yhdistetty yhdeksi kokonaisuudeksi, kun taas toiset työkalut voivat olla erikoistuneempia. Vaatimuksistasi riippuen saatat haluta yhden työkalun, joka tekee kaiken, tai koko joukon työkaluja eri tarkoituksiin.
Node.js:lle räätälöityjä työkaluja
Työkalujen lisäksi voimme ottaa mukaan myös muita Node.js-kohtaisia työkaluja ja profilointityökaluja, kuten liekkigraafeja (flame graphs), jotka tarkastelevat funktioidemme suoritusta tai poimivat tietoja tapahtumasilmukan suorituksesta. Kun perehdyt paremmin Node.js:n suorituskykytestaukseen, tietovaatimuksesi vain kasvavat. Haluat jatkossakin tehdä ostoksia, kokeilla ja päivittää työkalujasi, jotta ymmärrät sovelluksesi todella hyvin.
Nyt kun olemme asettaneet työkalumme, hankkineet realistiset profiilit suorituskyvyllemme ja ymmärtäneet sovelluksemme suorituskyvyn, olemme melkein valmiita suorittamaan testejämme. Mutta ennen sitä on vielä yksi vaihe: testi-infrastruktuurin luominen.
Vaihe 4: Node.js-suorituskykytesti-infrastruktuurin luominen
Voit halutessasi ajaa suorituskykytestejä omalta koneeltasi, mutta tähän liittyy ongelmia. Tähän mennessä olemme yrittäneet todella kovasti – esimerkiksi testiprofiileillamme – varmistaa, että suorituskykytestit toistuvat. Toinen tekijä testiemme replikoinnissa on varmistaa, että suoritamme ne aina samassa infrastruktuurissa (lue: koneessa).
Yksi helpoimmista tavoista saada aikaan yhtenäinen testi-infrastruktuuri on hyödyntää pilvipalvelun hostingia. Valitse isäntä/kone, josta haluat käynnistää testisi, ja varmista, että joka kerta, kun suoritat testisi, se tapahtuu aina samasta koneesta – ja mieluiten myös samasta sijainnista – jotta vältät pyyntöjen latenssiin perustuvan datan vääristymisen.
Tämä infrastruktuuri kannattaa skriptata, jotta voit luoda ja purkaa sen tarpeen mukaan. Tätä ajatusta kutsutaan ”infrastruktuuriksi koodina”. Useimmat pilvipalveluntarjoajat tukevat sitä natiivisti, tai voit käyttää apuna Terraformin kaltaista työkalua.
Phew! Olemme käsitelleet paljon tähän mennessä, ja olemme viimeisessä vaiheessa: testiemme suorittaminen.
Vaihe 5: Suorita testit!
Viimeinen vaihe on testiemme todellinen suorittaminen. Jos käynnistämme komentorivikonfiguraatiomme (kuten teimme vaiheessa 1), näemme pyyntöjä Node.js-sovelluksellemme. Seurantaratkaisumme avulla voimme tarkistaa, miten tapahtumasilmukkamme toimii, kestävätkö tietyt pyynnöt pidempään kuin toiset, ajoittuvatko yhteydet jne.
Suorituskykytestejäsi kruunaa se, että harkitset niiden sisällyttämistä build- ja testiputkeen. Yksi tapa tehdä tämä on ajaa suorituskykytestit yön yli, jotta voit tarkastella niitä joka aamu. Artillery tarjoaa mukavan, yksinkertaisen tavan luoda näitä raportteja, jotka voivat auttaa sinua havaitsemaan mahdolliset Node.js-suorituskyvyn regressiot.
Nyt sinulla on salamannopea Node.js
Tässä on paketti.
Tänään käsittelimme tapahtumasilmukan merkitystä JavaScript-sovelluksesi suorituskyvylle, miten valita suorituskykytestaustyökalusi, miten luoda johdonmukaisia suorituskykytestausprofiileja Artilleryn avulla, mitä monitorointia haluat asettaa diagnosoidaksesi Node.js-suorituskykyongelmien diagnosoimiseksi, ja lopuksi, miten ja milloin suoritat suorituskykytestit, jotta saat parhaan mahdollisen hyödyn itsellesi ja tiimillesi.
Kokeile monitorointityökaluja, kuten Retrace APM for Node.js -työkalua, tee pieniä muutoksia, jotta voit testata muutosten vaikutusta, ja tarkista testiraporttisi usein, jotta voit havaita regressiot. Nyt sinulla on kaikki mitä tarvitset, jotta voit hyödyntää Node.js:n suorituskykyominaisuuksia ja kirjoittaa erittäin suorituskykyisen sovelluksen, jota käyttäjät rakastavat!