Porovnanie vložených kontajnerov servletov v jarnom zavedení systému

1. Úvod

Rastúca popularita natívnych cloudových aplikácií a mikroslužieb generuje zvýšený dopyt po vložených servletových kontajneroch. Spring Boot umožňuje vývojárom ľahko vytvárať aplikácie alebo služby pomocou 3 najrozvinutejších dostupných kontajnerov: Tomcat, Undertow a Jetty.

V tomto tutoriáli si ukážeme spôsob, ako rýchlo porovnať implementácie kontajnerov pomocou metrík získaných pri štarte a pri nejakom načítaní.

2. Závislosti

Naše nastavenie pre každú dostupnú implementáciu kontajnera bude vždy vyžadovať, aby sme deklarovali závislosť od spring-boot-starter-web v našom pom.xml.

Vo všeobecnosti chceme určiť svojho rodiča ako pružina-štartér-štartér-rodič, a potom zahrňte požadované štartéry:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web 

2.1. Tomcat

Pri používaní Tomcat nie sú potrebné žiadne ďalšie závislosti, pretože pri použití sú predvolene zahrnuté spring-boot-starter-web.

2.2. Mólo

Aby sme mohli používať Jetty, musíme najskôr vylúčiť spring-boot-starter-tomcat od spring-boot-starter-web.

Potom jednoducho deklarujeme závislosť na pružinové-štartovacie-štartovacie-mólo:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-mólo 

2.3. Spodný protiprúd

Nastavenie pre Undertow je totožné s Jetty, až na to, že ho používame pružina-štartér-štartér-podvozok ako naša závislosť:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-undertow 

2.4. Aktuátor

Aplikáciu Spring Boot's Actuator použijeme ako pohodlný spôsob, ako stresovať systém aj dopytovať metriky.

V tomto článku nájdete podrobnosti o pohone. Do našich jednoducho pridáme závislosť pom sprístupniť:

 org.springframework.boot spring-boot-starter-aktuator 

2.5. Apache Bench

Apache Bench je open source nástroj na testovanie záťaže, ktorý sa dodáva s webovým serverom Apache.

Používatelia systému Windows si môžu stiahnuť Apache od niektorého z tu uvedených dodávateľov tretích strán. Ak je Apache už nainštalovaný na vašom počítači so systémom Windows, mali by ste byť schopní nájsť ab.exe vo vašom apache / bin adresár.

Ak používate počítač so systémom Linux, ab je možné nainštalovať pomocou trefne s:

$ apt-get nainštalovať apache2-utils

3. Metriky spustenia

3.1. Zbierka

Za účelom zhromaždenia našich metrík pri spustení zaregistrujeme obslužnú rutinu udalostí, ktorá sa má spustiť v Spring Boot ApplicationReadyEvent.

Programovo extrahujeme metriky, ktoré nás zaujímajú, priamou prácou s MeterRegistry používaný komponentom Aktuátor:

@Component verejná trieda StartupEventHandler {// logger, súkromný konštruktor String [] METRICS = {"jvm.memory.used", "jvm.classes.loaded", "jvm.threads.live"}; private String METRIC_MSG_FORMAT = "Startup Metric >> {} = {}"; súkromný MeterRegistry meterRegistry; @EventListener public void getAndLogStartupMetrics (udalosť ApplicationReadyEvent) {Arrays.asList (METRICS) .forEach (this :: getAndLogActuatorMetric); } private void processMetric (String metric) {Meter meter = meterRegistry.find (metrický) .meter (); Štatistiky mapy = getSamples (meter); logger.info (METRIC_MSG_FORMAT, metrika, stats.get (Statistic.VALUE) .longValue ()); } // ďalšie metódy}

Vyvarujeme sa nutnosti manuálneho dopytovania sa na koncových bodoch aktuátora REST alebo spustenia samostatnej konzoly JMX protokolovaním zaujímavých metrík pri štarte v rámci našej obsluhy udalostí.

3.2. Výber

Existuje veľké množstvo metrík, ktoré Actuator poskytuje po vybalení z krabice. Vybrali sme 3 metriky, ktoré pomáhajú získať prehľad o hlavných charakteristikách behu po dosiahnutí vysokej úrovne servera:

  • jvm.memory.used - celková pamäť použitá JVM od spustenia
  • jvm.classes.loaded - celkový počet načítaných tried
  • jvm.threads.live - celkový počet aktívnych vlákien. V našom teste možno túto hodnotu považovať za počet vlákien „v pokoji“

4. Metriky behu

4.1. Zbierka

Okrem poskytovania metrík pri spustení použijeme / metriky koncový bod vystavený aktuátorom ako cieľová adresa URL, keď spustíme program Apache Bench, aby sme aplikáciu zaťažili.

Na testovanie skutočnej aplikácie pri načítaní môžeme namiesto toho použiť koncové body poskytované našou aplikáciou.

Po spustení servera dostaneme príkazový riadok a vykonáme ho ab:

ab -n 10 000 -c 10 // localhost: 8080 / aktuátor / metriky

Vo vyššie uvedenom príkaze sme zadali celkovo 10 000 požiadaviek pomocou 10 súbežných vlákien.

4.2. Výber

Apache Bench nám dokáže veľmi rýchlo poskytnúť niektoré užitočné informácie vrátane časov pripojenia a percenta požiadaviek, ktoré sa vybavia v určitom čase.

Pre naše účely zamerali sme sa na požiadavky na sekundu a čas na žiadosť (priemer).

5. Výsledky

Pri štarte sme to zistili pamäťová stopa Tomcat, Jetty a Undertow bola porovnateľná pričom Undertow vyžaduje o niečo viac pamäte ako ostatné dva a Jetty vyžadujúce najmenšie množstvo.

Pre našu referenčnú hodnotu sme to zistili výkon Tomcat, Jetty a Undertow bol porovnateľný ale to Undertow bol jednoznačne najrýchlejší a Jetty iba o niečo menej rýchly.

MetrickéTomcatMóloSpodný protiprúd
jvm.memory.used (MB)168155164
jvm.classes.loaded986997849787
jvm.threads.live251719
Žiadosti za sekundu154216271650
Priemerný čas na žiadosť (ms)6.4836.1486.059

Upozorňujeme, že metriky sú, prirodzene, reprezentatívne pre projekt holých kostí; metriky vašej vlastnej aplikácie sa určite budú líšiť.

6. Referenčná diskusia

Vývoj vhodných porovnávacích testov na dôkladné porovnanie implementácií serverov sa môže skomplikovať. S cieľom získať najrelevantnejšie informácie je nevyhnutné mať jasné pochopenie toho, čo je dôležité pre daný prípad použitia.

Je dôležité si uvedomiť, že porovnávacie merania zhromaždené v tomto príklade boli vykonané pomocou veľmi špecifického pracovného zaťaženia pozostávajúceho z požiadaviek HTTP GET na koncový bod aktuátora.

Očakáva sa, že rôzne pracovné zaťaženia by pravdepodobne vyústili do rôznych relatívnych meraní naprieč implementáciami kontajnerov. Ak by boli potrebné dôkladnejšie alebo presnejšie merania, bolo by veľmi dobrým nápadom zostaviť plán testov, ktorý by viac zodpovedal prípadu použitia výroby.

Sofistikovanejšie porovnávacie riešenie, ako napríklad JMeter alebo Gatling, by navyše pravdepodobne prinieslo hodnotnejšie informácie.

7. Výber kontajnera

Výber správnej implementácie kontajnera by pravdepodobne mal byť založený na mnohých faktoroch, ktoré sa nedajú prehľadne zhrnúť iba pomocou niekoľkých metrík. Úroveň pohodlia, funkcie, dostupné možnosti konfigurácie a politika sú často rovnako dôležité, ak nie viac.

8. Záver

V tomto článku sme sa pozreli na implementácie vloženého servletového kontajnera Tomcat, Jetty a Undertow. Preskúmali sme runtime charakteristiky každého kontajnera pri štarte s predvolenými konfiguráciami tak, že sme sa pozreli na metriky vystavené komponentom Actuator.

Vykonali sme vykonštruované pracovné zaťaženie oproti bežiacemu systému a potom sme merali výkon pomocou aplikácie Apache Bench.

Na záver sme diskutovali o výhodách tejto stratégie a spomenuli niekoľko vecí, na ktoré treba pamätať pri porovnávaní implementačných kritérií. Všetky zdrojové kódy nájdete ako vždy na serveri GitHub.