Node.js známe díky jeho bleskovému výkonu. Přesto, stejně jako u každého jiného jazyka, můžete i v Node.js napsat kód, který bude pro uživatele výkonnější, než byste si přáli. Abychom s tím mohli bojovat, potřebujeme odpovídající testování výkonu. Dnes se budeme zabývat právě tím a podrobně se podíváme na to, jak nastavit a spustit testování výkonu a analyzovat výsledky, abyste mohli vytvářet bleskurychlé aplikace Node.js.
Nejlepším způsobem, jak pochopit, jak testovat výkon aplikace, je projít si příklad.
Node.js můžete používat k mnoha účelům: psaní skriptů pro spouštění úloh, provoz webového serveru nebo obsluhu statických souborů, například webových stránek. Dnes si projdeme kroky k otestování webového rozhraní API Node.js HTTP. Pokud však v Node vytváříte něco jiného, nebojte se – mnoho principů bude podobných.
- Jedinečná povaha výkonu Node.js
- Smyčka událostí
- Výkonnost Node.js a smyčka událostí
- Krok 1: Výběr nástrojů pro testování výkonu Node.js
- Krok 2: Vytvoření profilu výkonnostního testu Node.js
- Využití více profilů testů
- Replikace rozsáhlých distribuovaných systémů
- Krok 3: Nastavení pozorovatelnosti/monitorování
- Zprovoznění APM
- Nástroje přizpůsobené pro Node.js
- Krok 4: Vytvoření infrastruktury pro výkonnostní testy Node.js
- Krok 5: Spusťte testy!
- Nyní máte bleskově rychlý Node.js
Jedinečná povaha výkonu Node.js
Než začneme, podívejme se krátce na jednu z unikátnějších vlastností výkonu Node.js. Znalost těchto vlastností budeme později potřebovat při provádění výkonnostních testů.
O čem mluvím?“
Velkým aspektem u aplikací Node.js je jejich jednovláknové chování od spuštění do dokončení – usnadňuje ho takzvaná smyčka událostí. Vím, co si teď myslíte: to je hodně. Pojďme si to tedy trochu rozebrat, abychom pochopili, co to znamená.
Začněme s jednovláknovým zpracováním. Vláknování jako koncept umožňuje souběžné zpracování v rámci aplikace. Node.js tuto schopnost nemá, alespoň ne v tradičním smyslu. Místo toho máme pro psaní aplikací, které provádějí více úloh najednou, k dispozici asynchronní kód a smyčku událostí.
Smyčka událostí
Co je to smyčka událostí?
Smyčka událostí je způsob, jakým Node.js rozděluje dlouho běžící procesy na malé kousky. Funguje podobně jako srdeční tep: Každých několik milisekund Node.js zkontroluje pracovní frontu a spustí nové úlohy. Pokud je tam práce, přenese je do zásobníku volání a pak je spustí až do konce (o spouštění až do konce si povíme brzy).
Díky rozdělení úloh může Node.js provádět více úloh, což je vaše náhrada za vlákno. To znamená, že zatímco jedna úloha čeká, může se spustit jiná. Spíše než vlákno tedy používáme asynchronní kód, což usnadňují programovací styly jako zpětná volání, sliby a async/await. Většina hotových rozhraní API Node má jak synchronní, tak asynchronní způsob provádění.
Ok, takže se možná ptáte: Co má celý tento techno-žargon společného s výkonem?
Nechte mě to vysvětlit…
Výkonnost Node.js a smyčka událostí
Představte si, že vytváříte aplikaci Node.js se dvěma koncovými body: jedním pro odesílání souborů a druhým, který načítá profil uživatele. Rozhraní API pro uživatelský profil bude pravděpodobně vyžadováno podstatně častěji než rozhraní pro nahrávání souborů, a pokud nebude reagovat dostatečně rychle, bude blokovat každé načtení stránky pro každého uživatele – to není dobré.
Rozhraní API pro nahrávání uživatelů se používá zřídka. Uživatelé také očekávají, že nahrávání úloh bude trvat dlouho, ale k době načítání stránek jsou mnohem méně shovívaví. Pokud nebudeme programovat s ohledem na smyčku událostí, mohl by Node.js během nahrávání souboru nakonec zabírat všechny systémové prostředky a mohl by blokovat ostatním uživatelům používání vaší aplikace-uh-oh!
A proto je třeba pochopit jednovláknovou povahu Node.js. Při změně naší aplikace musíme toto chování zohlednit. Chceme se vyhnout synchronnímu provádění dlouhotrvajících úloh, například provádění síťových požadavků, zápisu souborů nebo provádění náročných výpočtů.
Teď, když víme o jednovláknové povaze Node.js, můžeme ji využít ve svůj prospěch. Projdeme si krok za krokem, jak můžete nastavit, spustit a analyzovat výkonnostní test vaší aplikace Node.js, abyste se ujistili, že děláte maximum pro využití výkonnostních schopností Node.js.
Krok 1: Výběr nástrojů pro testování výkonu Node.js
Nejprve si budete chtít vybrat nástroj, který vám umožní spustit výkonnostní testy. Existuje mnoho nástrojů, všechny mají různé výhody a nevýhody pro ladění výkonu Node.js. Jednou z hlavních věcí, kterou je třeba vzít v úvahu, je, že i když testujete aplikaci Node.js, pokud budete testovat výkon z vnějšího světa přes síť, nezáleží na tom, zda je váš nástroj pro testování výkonu napsán v Node.js.
Pro základní testování výkonu HTTP se mi líbí Artillery jednoduchý nástroj pro testování výkonu napsaný v Node.js. Je také obzvláště dobrý při provádění výkonnostních testů pro požadavky API. Artillery funguje tak, že napíše konfigurační soubor, který definuje váš profil zátěže. Řeknete Artillery, které koncové body chcete požadovat, jakou rychlostí, po jakou dobu atd.
Základní testovací skript vypadá takto:
config: target: 'https://artillery.io' phases: - duration: 60 arrivalRate: 20 defaults: headers: x-my-service-auth: '987401838271002188298567'scenarios:- flow:- get:url: "/docs"
Tady požadujete webovou stránku Artillery po dobu 60 sekund, přičemž na adresu URL přijde 20 nových uživatelů.
Poté pro spuštění testu jednoduše provedete:
artillery run your_config.yml
Artillery provede tolik požadavků na vaši aplikaci, kolik jste mu zadali. To je užitečné pro vytváření profilů testů výkonu, které napodobují vaše produkční prostředí. Co mám na mysli pod pojmem výkonnostní testovací profil? Tím se nyní budeme zabývat.
Krok 2: Vytvoření profilu výkonnostního testu Node.js
Profil výkonnostního testu, jak je uvedeno výše, je definice toho, jak bude váš výkonnostní test probíhat. Chcete-li provést přesné ladění výkonu Node.js, budete chtít pokud možno napodobit, jak se chová nebo jak se očekává, že se bude chovat váš produkční provoz. Pokud například vytváříte webovou stránku s událostmi, očekáváte velký provoz v době, kdy vydáváte vstupenky, takže budete chtít vytvořit profil, který toto chování napodobuje. Chtěli byste otestovat schopnost aplikace škálovat s velkým množstvím zátěže v krátkém čase. Případně, pokud provozujete e-shop, můžete očekávat rovnoměrný provoz. Zde by vaše profily testů výkonu měly odrážet toto chování.
Využití více profilů testů
Zábavným a zajímavým bodem je, že můžete vytvořit různé profily testů a spouštět je překrývajícím se způsobem. Můžete například vytvořit profil, který napodobuje vaši základní úroveň návštěvnosti – řekněme 100 požadavků za minutu – a pak napodobit, co by se mohlo stát, kdyby se na vašem webu objevila velká návštěvnost, například kdybyste na něj umístili reklamy z vyhledávačů. Testování více scénářů je důležité pro důkladné vyladění výkonu Node.js.
Replikace rozsáhlých distribuovaných systémů
Musím zde na chvíli něco poznamenat: Když aplikace dosáhne určité velikosti, imitace zátěže tímto způsobem ztrácí proveditelnost. Objem provozu, který můžete mít, může být tak divoký, nepředvídatelný nebo objemově velký, že je těžké vytvořit realistický způsob podobného testování aplikace před jejím vydáním.
A co když je to tak? Co budeme dělat? Testujeme ve výrobě.
Možná si říkáte: „Hrome, počkejte! Neměli bychom testovat před vydáním?“
Můžete, ale když systém dosáhne určité velikosti, může mít smysl využít jiné strategie testování výkonu. Můžete využít koncepty, jako je uvolňování kanárků, a vypustit změny do produkce a testovat je pouze s určitým procentem uživatelů. Pokud zaznamenáte pokles výkonu, můžete tento provoz převést zpět na předchozí implementaci. Tento postup skutečně podporuje experimentování a nejlepší na tom je, že testujete na své skutečné produkční aplikaci, takže se nemusíte obávat, že by výsledky testů nenapodobovaly produkci.
Dosud jsme se rozhodli pro naše nástroje a vytvořili jsme profily, které obnovují naši produkci, jako je provoz a pracovní zátěž. Co budeme dělat dál? Musíme zajistit, abychom měli data, která potřebujeme k analýze naší aplikace, a to uděláme pomocí nástrojů pro monitorování výkonu Node.js a správu výkonu aplikací (APM). Co je to APM? Čtěte dál a já vám to prozradím!
Krok 3: Nastavení pozorovatelnosti/monitorování
Nechceme jen spustit test výkonu proti naší aplikaci a doufat a modlit se. Pokud to uděláme, nebudeme schopni pochopit, jak funguje a zda dělá to, co si myslíme, že by měla. Než tedy začneme, měli bychom si položit otázky typu: „Jak pro mou aplikaci vypadá dobře? Jaké jsou mé smlouvy SLA a klíčové ukazatele výkonnosti? Jaké metriky jsou potřeba k efektivnímu ladění problému s výkonem?“
Pokud vaše aplikace funguje pomalu nebo jinak, než jste očekávali, budete potřebovat data, abyste pochopili proč, a mohli ji tak zlepšit. Všechny produkční aplikace, které stojí za to, používají nějakou formu řešení pro sledování a/nebo monitorování. Tyto nástroje, často nazývané APM, vám umožňují zobrazit kritické metriky výkonu Node.js o vaší běžící aplikaci.
Zprovoznění APM
APM se dodávají v různých tvarech a velikostech, všechny s různými funkcemi, cenovkami, bezpečnostními dopady, výkonem a podobně. Vyplatí se trochu se porozhlédnout, abyste našli nejlepší nástroj pro své potřeby. Právě tyto nástroje nám poskytnou poznatky a data, která potřebujeme při spouštění výkonnostních testů Node.js.
Takže, když víme, že bychom měli monitorovat naši aplikaci – co přesně bychom měli monitorovat?
Pravda, chcete co nejvíce dat – ale stejně jako milujeme data; musíme být realisté ohledně toho, kde začít! Nejlepší je začít s následujícími třemi oblastmi:
- Agregované protokoly-Aplikační protokoly emitují buď implicitně některé knihovny, nebo explicitně vývojáři pro získání náhledu na aplikaci. Většina nástrojů pro agregované logy umožňuje snadné vyhledávání a vizualizaci zaznamenaných dat. V našem případě bychom mohli vypsat výkon jednotlivých API a vykreslit je do grafu.
- Pohled na infrastrukturu-Vaše aplikace poběží na různém hostiteli, takže pravděpodobně budete chtít vidět všechna data. Pokud běžíte v cloudu, většina poskytovatelů vám tato data (i když v hrubé podobě) poskytne ihned. Data, která z těchto nástrojů získáte, budou zahrnovat věci jako využití procesoru a paměti hostitele, údaje o připojení atd.
- Monitorování aplikací – Tento typ nástroje se obvykle nachází v kódu vaší aplikace a může čerpat poznatky o tom, jak se provádějí/volají funkce, jaké chyby vyhazujeme atd.
Některé nástroje APM, například Retrace, mají všechny nebo většinu těchto tří funkcí v jednom, zatímco jiné mohou být více specializované. V závislosti na vašich požadavcích můžete chtít jeden nástroj, který dělá všechno, nebo celou řadu nástrojů pro různé účely.
Nástroje přizpůsobené pro Node.js
Kromě nástrojů můžeme zahrnout i další nástroje a profilery specifické pro Node.js, například flame grafy, které se podívají na provádění našich funkcí nebo získají data o provádění smyček událostí. Jak se budete lépe orientovat v testování výkonu Node.js, vaše požadavky na data budou jen růst. Budete chtít neustále nakupovat, experimentovat a aktualizovat své nástroje, abyste skutečně porozuměli své aplikaci.
Teď, když jsme nastavili naše nástroje, získali realistické profily pro náš výkon a porozuměli výkonu naší aplikace, jsme téměř připraveni spustit naše testy. Než to ale uděláme, čeká nás ještě jeden krok: vytvoření testovací infrastruktury.
Krok 4: Vytvoření infrastruktury pro výkonnostní testy Node.js
Pokud chcete, můžete výkonnostní testy spouštět z vlastního počítače, ale jsou s tím problémy. Dosud jsme se opravdu snažili – například pomocí našich testovacích profilů – zajistit, aby se naše výkonnostní testy replikovaly. Dalším faktorem replikace našich testů je zajistit, abychom je vždy spouštěli na stejné infrastruktuře (čti: stroji).
Jedním z nejjednodušších způsobů, jak dosáhnout konzistentní testovací infrastruktury, je využití cloudového hostingu. Vyberte si hostitele/stroj, ze kterého chcete spouštět své testy, a zajistěte, abyste je pokaždé spouštěli vždy ze stejného stroje – a nejlépe také ze stejného místa, aby nedocházelo ke zkreslení dat na základě zpoždění požadavků.
Tuto infrastrukturu je dobré naskriptovat, abyste ji mohli vytvářet a rušit podle potřeby. Této myšlence se říká „infrastruktura jako kód“. Většina poskytovatelů cloudových služeb ji nativně podporuje, nebo si můžete pomoci nástrojem, jako je Terraform.
Uf! Zatím jsme toho probrali hodně a jsme u posledního kroku: spuštění našich testů.
Krok 5: Spusťte testy!
Posledním krokem je skutečné spuštění našich testů. Pokud spustíme naši konfiguraci příkazového řádku (stejně jako v kroku 1), uvidíme požadavky na naši aplikaci Node.js. Díky našemu monitorovacímu řešení můžeme zkontrolovat, jak funguje naše smyčka událostí, zda některé požadavky netrvají déle než jiné, zda nedochází k časování spojení atd.
Třešničkou na dortu vašich výkonnostních testů je zvážit jejich zařazení do sestavovací a testovací pipeline. Jedním ze způsobů, jak toho dosáhnout, je spouštět výkonnostní testy přes noc, abyste si je mohli každé ráno prohlédnout. Artillery poskytuje pěkný a jednoduchý způsob vytváření těchto přehledů, které vám mohou pomoci odhalit případné výkonnostní regrese Node.js.
Nyní máte bleskově rychlý Node.js
To je vše.
Dnes jsme se zabývali významem smyčky událostí pro výkon vaší aplikace v JavaScriptu, jak si vybrat nástroje pro testování výkonu, jak nastavit konzistentní profily testování výkonu pomocí Artillery, jaké monitorování budete chtít nastavit pro diagnostiku Node.js, a nakonec, jak a kdy spouštět výkonnostní testy, abyste z nich vy i váš tým získali co největší užitek.
Experimentujte s monitorovacími nástroji, jako je Retrace APM pro Node.js, provádějte malé změny, abyste mohli testovat dopad změn, a často kontrolujte zprávy o testech, abyste mohli odhalit regrese. Nyní máte vše, co potřebujete, abyste využili výkonnostní možnosti Node.js a napsali super výkonnou aplikaci, kterou si vaši uživatelé zamilují!