A beágyazott Servlet-konténerek összehasonlítása a tavaszi csomagtartóban

1. Bemutatkozás

A felhőben honos alkalmazások és a mikropalvelu növekvő népszerűsége megnövelt keresletet eredményez a beágyazott szervlet-konténerek iránt. A Spring Boot lehetővé teszi a fejlesztők számára, hogy az elérhető 3 legfejlettebb tároló használatával egyszerűen készítsenek alkalmazásokat vagy szolgáltatásokat: Tomcat, Undertow és Jetty.

Ebben az oktatóanyagban bemutatjuk a tároló implementációk gyors összehasonlításának módját az indításkor és bizonyos terhelés alatt kapott mutatók felhasználásával.

2. Függőségek

Az elérhető tároló-megvalósítások beállításához mindig meg kell követelnünk a függőséget tavasz-boot-starter-web miénkben pom.xml.

Általánosságban a szülőnket szeretnénk megadni tavasz-bakancs-induló-szülő, majd adja meg a kívánt kezdőket:

 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. Kandúr

A Tomcat használatakor nincs szükség további függőségekre, mert a használat során alapértelmezés szerint szerepel tavasz-boot-starter-web.

2.2. Móló

A móló használatához először ki kell zárnunk tavasz-csizma-indító-bika tól től tavasz-boot-starter-web.

Ezután egyszerűen deklaráljuk a függőséget tavaszi-bakancs-indító-móló:

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

2.3. Hullámtörés

Az Undertow felállítása megegyezik a Mólóval, kivéve, hogy mi használjuk tavaszi-bakancs-indító-alátét mint függőségünk:

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

2.4. Működtető

A Spring Boot's Actuator-t kényelmes módszerként használjuk a rendszer hangsúlyozására és a mutatók lekérdezésére.

Tekintse meg ezt a cikket az aktuátorról. Egyszerűen hozzáadunk egy függőséget pom hogy elérhetővé tegye:

 org.springframework.boot spring-boot-starter-actuator 

2.5. Apache pad

Az Apache Bench egy nyílt forráskódú terhelés-tesztelő segédprogram, amely az Apache webszerverhez tartozik.

A Windows-felhasználók letölthetik az Apache-t az itt linkelt harmadik fél egyik gyártótól. Ha az Apache már telepítve van a Windows gépére, akkor képesnek kell lennie arra, hogy megtalálja ab.exe a te apache / bin Könyvtár.

Ha Linux gépen van, ab segítségével telepíthető apt-get val vel:

$ apt-get install apache2-utils

3. Indítási mutatók

3.1. Gyűjtemény

Az indítási mutatók összegyűjtése érdekében regisztrálunk egy eseménykezelőt, amely a Spring Boot's-ra lő ApplicationReadyEvent.

Programozottan kibontjuk az érdeklődésre számot tartó mutatókat azáltal, hogy közvetlenül a MeterRegistry az Actuator komponens által használt:

@Component public class StartupEventHandler {// logger, constructor private String [] METRICS = {"jvm.memory.used", "jvm.classes.loaded", "jvm.threads.live"}; privát karakterlánc METRIC_MSG_FORMAT = "Indítási mutató >> {} = {}"; privát MeterRegistry meterRegistry; @EventListener public void getAndLogStartupMetrics (ApplicationReadyEvent event) {Arrays.asList (METRICS) .forEach (this :: getAndLogActuatorMetric); } private void processMetric (String metric) {Meter meter = meterRegistry.find (metric) .meter (); Térkép statisztikák = getSamples (méter); logger.info (METRIC_MSG_FORMAT, metric, stats.get (Statistic.VALUE) .longValue ()); } // egyéb módszerek}

Kerüljük annak szükségességét, hogy manuálisan lekérdezzük az Actuator REST végpontjait, vagy különálló JMX konzolt futtassunk, ha érdekes mutatókat naplózunk az indításkor az eseménykezelőnkön belül.

3.2. Kiválasztás

Számos olyan mutató van, amelyet az Actuator a dobozból nyújt. 3 olyan mutatót választottunk ki, amelyek segítenek magas szintű áttekintést kapni a fő futásidejű jellemzőkről, ha a szerver fel van állítva:

  • jvm.memória.használt - a JVM által az indítás óta használt összes memória
  • jvm.osztályok.töltve - a betöltött osztályok teljes száma
  • jvm.szálak.él - az aktív szálak teljes száma. Tesztünk során ezt az értéket úgy tekinthetjük meg, hogy a szálszám „nyugalomban”

4. Futásidejű mérőszámok

4.1. Gyűjtemény

Az indítási mutatók megadásán kívül a / metrikák végpont, amelyet az Actuator tett ki cél URL-ként, amikor az Apache Bench-t futtatjuk annak érdekében, hogy az alkalmazás terhelés alá kerüljön.

Valódi alkalmazás tesztelése terhelés alatt ehelyett használhatjuk az alkalmazásunk által biztosított végpontokat.

Miután a szerver elindult, kapunk egy parancssort és végrehajtjuk ab:

ab -n 10000 -c 10 // localhost: 8080 / működtető / metrika

A fenti parancsban összesen 10 000 kérést adtunk meg 10 egyidejű szál felhasználásával.

4.2. Kiválasztás

Az Apache Bench nagyon gyorsan képes hasznos információkat nyújtani számunkra, beleértve a csatlakozási időket és az egy bizonyos időn belül kiszolgált kérelmek százalékos arányát.

Céljainkra a másodpercenkénti és a kérésenkénti időre (átlag) összpontosítottunk.

5. Eredmények

Indításkor ezt találtuk Tomcat, Jetty és Undertow memória-lábnyoma összehasonlítható volt Undertow-nál valamivel több memória szükséges, mint a másik kettőnél, és a Jetty-nél a legkevesebb mennyiségre van szükség.

A referenciaértékünkhöz ezt találtuk a Tomcat, a Jetty és az Undertow teljesítménye összehasonlítható volt de az Undertow egyértelműen a leggyorsabb volt, a Jetty pedig csak valamivel kevésbé gyors.

MetrikusKandúrMólóHullámtörés
jvm.memory.used (MB)168155164
jvm.osztályok.töltve986997849787
jvm.szálak.él251719
Kérelmek másodpercenként154216271650
Átlagos idő kérésre (ms)6.4836.1486.059

Vegye figyelembe, hogy a mutatók természetesen reprezentálják a csupasz csont projektet; a saját alkalmazásod mutatói egészen biztosan különböznek egymástól.

6. Összehasonlító megbeszélés

A szerver implementációinak alapos összehasonlítása céljából megfelelő benchmark tesztek kidolgozása bonyolulttá válhat. A legrelevánsabb információk kinyerése érdekében kritikus fontosságú, hogy tisztán megértsük, mi fontos a szóban forgó felhasználási eset szempontjából.

Fontos megjegyezni, hogy az ebben a példában összegyűjtött benchmark méréseket egy nagyon specifikus munkaterhelés felhasználásával végezték, amely HTTP GET kéréseket tartalmaz egy Actuator végponthoz.

Várható, hogy a különböző munkaterhelések valószínűleg eltérő relatív méréseket eredményeznek a konténer megvalósításai között. Ha erőteljesebb vagy pontosabb mérésekre lenne szükség, nagyon jó ötlet lenne egy olyan teszttervet felállítani, amely jobban illeszkedik a gyártás felhasználási esetéhez.

Ezenkívül egy olyan kifinomultabb benchmarking megoldás, mint a JMeter vagy a Gatling, valószínűleg értékesebb betekintést eredményezne.

7. Konténer kiválasztása

A megfelelő tároló megvalósítás kiválasztásának valószínűleg sok olyan tényezőn kell alapulnia, amelyeket nem lehet egyszerűen összefoglalni csupán néhány mutatóval. A kényelmi szint, a funkciók, az elérhető konfigurációs lehetőségek és a házirend gyakran ugyanolyan fontos, ha nem is inkább.

8. Következtetés

Ebben a cikkben a Tomcat, a Móló és az Undertow beágyazott szervlet-konténer implementációit vizsgáltuk. Megvizsgáltuk az egyes tárolók futási jellemzőit indításkor az alapértelmezett konfigurációkkal, az Actuator komponens által kitett mutatók alapján.

Kialakított munkaterhelést hajtottunk végre a futó rendszerrel szemben, majd az Apache Bench segítségével mértük a teljesítményt.

Végül megvitattuk ennek a stratégiának az előnyeit, és megemlítettünk néhány dolgot, amelyet szem előtt kell tartani a végrehajtási referenciaértékek összehasonlításakor. Mint mindig, minden forráskód megtalálható a GitHubon.