Porównanie serwera WWW: Java jest wolniejsza niż Node.js
Naprawdę? Zakodujmy i porównajmy.
W zeszłym tygodniu, w środku długiego urlopu, Medium.com zaproponował mi ten artykuł . Jest to porównanie Node.js z natywnym serwerem HTTP Java.
Następnie śledziłem ten inny test porównawczy Java vs Node.js tego samego autora, a następnie ten artykuł o fiasku Java . Ogólne wrażenia z czytania sprawiły, że poczułem, że Java jest gorsza w porównaniu z Node.js. Przypomina mi młodego programistę. Jest młody, ambitny i chce zamienić wszystko, czego dotknie, w JavaScript i TypeScript.
„Java jest powolna” — powiedział.
Cóż, mogę o tym dyskutować w sekcji komentarzy. Mógłbym wyjaśnić, w jaki sposób aplikacja używa wątków i jak wątek Java jest powiązany z wątkiem systemu operacyjnego oraz w jaki sposób Springboot jest jak duża ciężarówka, a ty marnujesz jego możliwości. Mogę również zasugerować porównanie go z reaktywnym, nieblokującym frameworkiem Java, pokazując niektóre strony internetowe, które wykonują testy porównawcze i bla..bla..bla. W końcu jestem pewien, że nikogo nie przekonam!
„Byłoby zabawnie, gdybym mógł pokazać, jak bardzo się mylą, samodzielnie kodując test porównawczy” — pomyślałem.
Więc powiedziałem sobie, trzymaj mój Rendang , zakodujmy i dowiedzmy się.
Mechanizm testowy
Postępuję zgodnie ze sposobem, w jaki autor w tym artykule wykonał test porównawczy:
- Zwracanie prostego ciągu znaków.
- Przetestuj za pomocą Bombardiera — jest to narzędzie Go do przeprowadzania testów obciążenia. Informacje można znaleźć tutaj .
- I użyj tej samej maszyny do aplikacji (SUT) i narzędzia do testowania obciążenia.
Aplikacja będzie korzystać z następującego sprzętu i oprogramowania:
- Procesor Intel i7 z 4 rdzeniami
- Pamięć RAM: 16 GB
- Windows 11 Pro, wersja 22H2
- Jawa 20
- Węzeł 18
Przetestujemy 2 popularne serwery WWW Node.js, 2 niereaktywne serwery WWW Java i 2 reaktywne serwery WWW Java. Tutaj są:
- Express : bardzo popularny serwer WWW Node.js.
- Fastify : twierdzi, że jest najszybszym serwerem WWW Node.js.
- Jetty : popularny niereaktywny serwer WWW Java.
- Undertow : kolejny tradycyjny niereaktywny serwer WWW Java używany przez wiele platform Java, w tym Springboot.
- Reactor : reaktywny serwer Java, który zasila wiosenny webflux.
- Vert.x-Web : kolejny popularny reaktywny serwer Java
- To nie jest naukowy punkt odniesienia. Interesuje mnie wydajność — tylko żądanie na sekundę. Jeśli potrzebujesz testu porównawczego dla swojego projektu, który korzysta z powyższych serwerów, powinieneś przeprowadzić analizę dla swojego przypadku użycia. Prawdopodobnie musisz zebrać bardziej kompleksową macierz.
- Cały kod źródłowy do tego testu można znaleźć w moim repozytorium GitHub. Tutaj jest link:https://github.com/mailindra/webserver-comparison.
- Jeśli uważasz, że jest coś, co mogę zrobić, aby poprawić wydajność, dla Javy lub Node.js, daj mi znać w komentarzu. Lub lepiej sklonuj moje repozytorium, przetestuj je samodzielnie i wyślij mi żądanie ściągnięcia.
Node.js: Express
Witryna Express twierdzi, że jest to minimalistyczny framework sieciowy. Jak widać poniżej, kod Express jest prosty i świadomy. W tym teście porównawczym serwer po prostu zwraca „Hello, People” dla każdego żądania.
Po uruchomieniu aplikacji testujemy ją.
Najpierw z małymi połączeniami - małymi żądaniami, a następnie przy użyciu 500 połączeń i 1 miliona żądań. Przed każdym testem wykonywałem 1 rundę rozgrzewki. Oto wynik:
A. Test z 50 połączeniami i 1000 żądaniami:
B. Test z 500 połączeniami i 1 milionem żądań:
Node.js: Fastify
Kod Fastify wygląda podobnie do Express. Witryna twierdzi, że Fastify jest wysoce wydajny i przyjazny dla programistów. Oto kod:
A. Test 50 połączeń i 1000 żądań:
B. Test 500 połączeń i 1 miliona żądań:
Wyniki Fastify pokazują, że jest znacznie szybszy niż Express. Twierdzenie witryny Fastify wydaje się być poprawne .
Jawa: molo
Jetty to serwer WWW Java i kontener serwletów. Jest niereaktywny, ale obsługuje asynchroniczne. Oto kod:
A. Test z 50 połączeniami i 1000 żądaniami:
B. Test z 500 połączeniami i 1 milionem żądań:
Jak widać w wyniku, Jetty radzi sobie całkiem nieźle. Jest o wiele szybszy niż node.js Fastify.
Jawa: Prąd
Podobnie jak Jetty, Undertow jest niereaktywnym serwerem internetowym Java. Jest przeznaczony do osadzania. Jak widać poniżej, kod jest płynny i łatwy do naśladowania:
A. Test z 50 połączeniami i 1000 żądaniami:
B. Test z 500 połączeniami i 1 milionem żądań:
Z wyniku widać, że Undertow jest znacznie szybszy niż oba serwery Node.js. Jest nawet szybszy niż Jetty.
Java: Reaktor
Reactor, a dokładniej Reactor-Netty, to reaktywny serwer WWW, który zasilał Spring Webflux. Jak widać, kod jest prostszy niż Jetty i Undertow. Wygląda całkiem podobnie do Node.js:
A. Test z 50 połączeniami i 1000 żądaniami:
B. Test z 500 połączeniami i 1 milionem żądań:
Ponownie Java Reactor działa znacznie szybciej niż oba serwery WWW Node.js.
Java: Vertx Web
Jak stwierdzono w dokumentacji , Vert.x-Web to szwajcarski scyzoryk Java do budowy nowoczesnych aplikacji internetowych. Jest to reaktywna struktura. Podobnie jak w przypadku Reactor, kod jest również płynny i łatwy do naśladowania.
A. Test z 50 połączeniami i 1000 żądaniami:
B. Test z 500 połączeniami i 1 milionem żądań:
Jak widać, Vertx radzi sobie całkiem nieźle. Lepsze niż serwery Node.js, a nawet lepsze niż Java Reactor.
Wynik
Abyśmy mogli mieć dobrą wizualizację, tworzę wykres słupkowy tego testu porównawczego:
- Pierwszy test, wynik testu 50 jednoczesnych połączeń i 1000 żądań:
Wniosek
- Nie, Java nie jest wolniejsza niż Node.js i JavaScript. Dobrą rzeczą w samodzielnym przeprowadzeniu testu porównawczego jest to, że możesz się przekonać. Nie możesz przekonać innych do czegoś, w co nie wierzysz.
- Zarówno serwery Java Reactive, jak i Non-Reactive działają lepiej niż serwery Node.js.
- Zaskakuje mnie, że serwery Java Non-blocking radzą sobie dobrze przy niskich i wysokich połączeniach jednoczesnych i mogą konkurować z serwerami reaktywnymi, takimi jak Reactor i Vert.x.
- Ekspres :https://expressjs.com/
- popraw :https://www.fastify.io/
- molo :https://www.eclipse.org/jetty/
- Prąd :https://undertow.io/
- reaktor :https://projectreactor.io/
- Vert.x-Web :https://vertx.io/docs/vertx-web/java/
- Repozytorium testów porównawczych :https://github.com/mailindra/webserver-comparison