Porównanie serwera WWW: Java jest wolniejsza niż Node.js

May 08 2023
Naprawdę? Zakodujmy i porównajmy. W zeszłym tygodniu, w środku długiego urlopu, Medium.

Naprawdę? Zakodujmy i porównajmy.

Zdjęcie Ralfsa Blumbergsa na Unsplash

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:

Express przetestowany pod kątem obsługi 50 połączeń i 1000 żądań

B. Test z 500 połączeniami i 1 milionem żądań:

Express przetestowany pod kątem obsługi 500 połączeń i 1 miliona żą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ń:

Fastify przetestowane pod kątem obsługi 50 połączeń i 1000 żądań

B. Test 500 połączeń i 1 miliona żądań:

Fastify przetestowane pod kątem obsługi 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:

Jetty przetestowane pod kątem obsługi 50 połączeń i 1000 żądań

B. Test z 500 połączeniami i 1 milionem żądań:

Jetty przetestowano pod kątem obsługi 500 połączeń i 1 miliona żą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:

Undertow przetestowany pod kątem obsługi 50 połączeń i 1000 żądań

B. Test z 500 połączeniami i 1 milionem żądań:

Undertow przetestowano pod kątem obsługi 500 połączeń i 1 miliona żą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:

Reactor przetestowany pod kątem obsługi 50 połączeń i 1000 żądań

B. Test z 500 połączeniami i 1 milionem żądań:

Reactor przetestowany pod kątem obsługi 500 połączeń i 1 miliona żą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:

Vertx-Web przetestowano pod kątem obsługi 50 połączeń i 1000 żądań

B. Test z 500 połączeniami i 1 milionem żądań:

Vertx-web przetestowany pod kątem obsługi 500 połączeń i 1 miliona żą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:

  1. Pierwszy test, wynik testu 50 jednoczesnych połączeń i 1000 żądań:
  2. 50 jednoczesnych połączeń i 1 000 żądań (autor: Ronny Mailindra)
Test porównawczy wyniku końcowego (Autor: Ronny Mailindra)

Wniosek

  1. 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.
  2. Zarówno serwery Java Reactive, jak i Non-Reactive działają lepiej niż serwery Node.js.
  3. 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