Usporedba ugrađenih spremnika servleta u Spring Boot

1. Uvod

Rastuća popularnost aplikacija i mikro usluga u oblaku generira povećanu potražnju za ugrađenim spremnicima servleta. Spring Boot omogućava programerima da lako izgrade aplikacije ili usluge pomoću 3 najzrelija dostupna spremnika: Tomcat, Undertow i Jetty.

U ovom uputstvu pokazat ćemo način brzog uspoređivanja implementacija spremnika pomoću mjernih podataka dobivenih pri pokretanju i pod određenim opterećenjem.

2. Ovisnosti

Naše postavljanje za svaku dostupnu implementaciju spremnika uvijek će zahtijevati da proglasimo ovisnost o proljeće-boot-starter-web u našem pom.xml.

Općenito, želimo odrediti svog roditelja kao proljeće-čizma-starter-roditelj, a zatim uključite početnike koje želimo:

 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. Mačak

Nisu potrebne daljnje ovisnosti kada se koristi Tomcat, jer je uključen prema zadanim postavkama prilikom upotrebe proljeće-boot-starter-web.

2.2. Brana

Da bismo koristili Jetty, prvo moramo izuzeti spring-boot-starter-tomcat iz proljeće-boot-starter-web.

Tada jednostavno deklariramo ovisnost o proljeće-čizma-starter-mol:

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

2.3. Undertow

Postavljanje za Undertow identično je Jettyju, osim što ga mi koristimo spring-boot-starter-undertow kao naša ovisnost:

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

2.4. Pokretač

Koristit ćemo Spring Boot's Actuator kao prikladan način za naglašavanje sustava i upit za mjerne podatke.

Pogledajte ovaj članak za detalje o aktuatoru. Jednostavno dodajemo ovisnost u naš pom kako bi ga učinili dostupnim:

 org.springframework.boot opruga-pokretač-pokretač-pokretač 

2.5. Klupa Apača

Apache Bench je uslužni program za testiranje učitavanja otvorenog koda koji dolazi u paketu s web poslužiteljem Apache.

Korisnici Windowsa mogu preuzeti Apache od jednog od ovdje povezanih dobavljača. Ako je Apache već instaliran na vašem Windows računalu, trebali biste ga moći pronaći ab.exe u vašem apache / kanta za smeće imenik.

Ako ste na Linux stroju, ab može se instalirati pomoću prikladno-dobiti s:

$ apt-get instalirajte apache2-utils

3. Metrika pokretanja

3.1. Kolekcija

Da bismo prikupili naše mjerne podatke o pokretanju, registrirat ćemo obrađivač događaja koji će se aktivirati na Spring Boot-u ApplicationReadyEvent.

Programski ćemo izdvojiti mjerne podatke koji nas zanimaju izravnom suradnjom s MeterRegistry koristi komponenta aktuatora:

@Component javna klasa StartupEventHandler {// logger, konstruktor private String [] METRICS = {"jvm.memory.used", "jvm.classes.loaded", "jvm.threads.live"}; private String METRIC_MSG_FORMAT = "Startup Metric >> {} = {}"; privatni MeterRegistry meterRegistry; @EventListener javna praznina getAndLogStartupMetrics (događaj ApplicationReadyEvent) {Arrays.asList (METRICS) .forEach (this :: getAndLogActuatorMetric); } private void processMetric (String metric) {Meter meter = meterRegistry.find (metric) .meter (); Statistika karte = getSamples (metar); logger.info (METRIC_MSG_FORMAT, metrika, stats.get (Statistic.VALUE) .longValue ()); } // ostale metode}

Izbjegavamo potrebu ručnog ispitivanja krajnjih točaka Actuator REST ili pokretanja samostalne JMX konzole bilježenjem zanimljivih mjernih podataka prilikom pokretanja unutar našeg rukovatelja događaja.

3.2. Izbor

Postoji velik broj mjernih podataka koje Actuator pruža izvan okvira. Odabrali smo 3 metričke vrijednosti koje pomažu dobiti pregled ključnih karakteristika izvršavanja na visokoj razini nakon što poslužitelj ustane:

  • jvm.memorija.korišteno - ukupna memorija koju JVM koristi od pokretanja
  • jvm.classes.loaded - ukupan broj učitanih klasa
  • jvm.nitki.živi - ukupan broj aktivnih niti. U našem se testu ova vrijednost može promatrati kao broj niti "u mirovanju"

4. Runtime metrika

4.1. Kolekcija

Uz pružanje mjernih podataka o pokretanju, koristit ćemo i /metrika krajnju točku koju Actuator izlaže kao ciljani URL kada pokrenemo Apache Bench kako bismo aplikaciju stavili pod opterećenje.

Da bismo testirali stvarni program pod opterećenjem, umjesto toga bismo mogli koristiti krajnje točke koje pruža naša aplikacija.

Nakon što poslužitelj započne, dobit ćemo naredbeni redak i izvršiti ga ab:

ab -n 10000 -c 10 // localhost: 8080 / aktuator / metrika

U gornjoj naredbi naveli smo ukupno 10 000 zahtjeva koristeći 10 istodobnih niti.

4.2. Izbor

Apache Bench nam može vrlo brzo pružiti neke korisne informacije, uključujući vrijeme povezivanja i postotak zahtjeva koji se poslužuju u određenom vremenu.

U naše svrhe, usredotočili smo se na zahtjeve u sekundi i vrijeme po zahtjevu (prosječno).

5. Rezultati

Pri pokretanju smo to otkrili memorijski otisak Tomcata, Jettyja i Undertowa bio je usporediv s Undertowom je potrebno malo više memorije od ostala dva, a s Jettyjem je potrebna najmanja količina.

Za naše mjerilo pronašli smo to izvedba Tomcat, Jetty i Undertow bila je usporediva ali to Undertow je očito bio najbrži, a Jetty tek nešto manje brz.

MetričkiMačakBranaUndertow
jvm.memory.used (MB)168155164
jvm.classes.loaded986997849787
jvm.nitki.živi251719
Zahtjevi u sekundi154216271650
Prosječno vrijeme po zahtjevu (ms)6.4836.1486.059

Imajte na umu da su metrički podaci, naravno, reprezentativni za projekt golih kostiju; mjerni podaci vaše vlastite aplikacije zasigurno će biti drugačiji.

6. Benchmark rasprava

Razvoj odgovarajućih referentnih testova za temeljitu usporedbu implementacija poslužitelja može se zakomplicirati. Kako bi se izvadile najrelevantnije informacije, presudno je imati jasno razumijevanje onoga što je važno za predmetni slučaj upotrebe.

Važno je napomenuti da su mjerenja referentne vrijednosti prikupljena u ovom primjeru izvršena pomoću vrlo specifičnog radnog opterećenja koje se sastoji od HTTP GET zahtjeva za krajnju točku aktuatora.

Očekuje se da bi različita opterećenja vjerojatno rezultirala različitim relativnim mjerenjima u implementacijama spremnika. Ako bi bila potrebna robusnija ili preciznija mjerenja, bilo bi vrlo dobro postaviti plan ispitivanja koji bi se više podudarao s primjerom proizvodnje.

Uz to, sofisticiranije rješenje za usporedbu poput JMetera ili Gatlinga vjerojatno bi donijelo dragocjenije uvide.

7. Odabir spremnika

Odabir odgovarajuće implementacije spremnika vjerojatno bi se trebao temeljiti na mnogim čimbenicima koje nije moguće sažeti samo s pregršt mjernih podataka. Razina udobnosti, značajke, dostupne opcije konfiguracije i pravila često su jednako važni, ako ne i važniji.

8. Zaključak

U ovom smo članku pogledali implementacije ugrađenih servlet spremnika Tomcat, Jetty i Undertow. Ispitali smo karakteristike izvođenja svakog spremnika prilikom pokretanja sa zadanim konfiguracijama gledajući mjerne podatke izložene komponenti Actuator.

Izvršili smo izmišljeno radno opterećenje prema pokrenutom sustavu, a zatim smo izmjerili performanse pomoću Apache Bench-a.

Na kraju, razgovarali smo o zaslugama ove strategije i spomenuli nekoliko stvari koje moramo imati na umu prilikom usporedbe mjerila za provedbu. Kao i uvijek, sav izvorni kod možete pronaći na GitHubu.