Web Sunucusu Karşılaştırması: Java, Node.js'den daha yavaştır
Gerçekten mi? Kodlayalım ve karşılaştıralım.
Geçen hafta, uzun bir tatilin ortasında, Medium.com bana bu makaleyi önerdi . Node.js ile Java yerel HTTP sunucusunun karşılaştırmasıdır.
Bundan sonra, aynı yazarın diğer Java vs Node.js karşılaştırmasını ve ardından bu Java fiyasko makalesini takip ettim . Genel okuma deneyimi, Java'nın Node.js karşısında yetersiz olduğunu hissetmeme neden oldu. Bana genç bir geliştiriciyi hatırlatıyor. O genç, hırslı ve dokunduğu her şeyi Javascript ve Typescript'e dönüştürmek istiyor.
"Java yavaş," dedi.
Peki, yorum bölümünde bunun hakkında tartışabilirim. Uygulamanın iş parçacığını nasıl kullandığını ve Java iş parçacığının işletim sistemi iş parçacığına nasıl bağlı olduğunu ve Springboot'un nasıl büyük bir kamyon gibi olduğunu ve yeteneğini boşa harcadığınızı açıklayabilirim. Ayrıca, kıyaslama ve bla..bla..bla yapan bazı web sitelerini göstererek, Java reaktif engellemeyen çerçevesiyle karşılaştırmanızı önerebilirim. Günün sonunda eminim ki kimseyi ikna edemeyeceğim!
“Kıyaslamayı kendim kodlayarak ne kadar hatalı olduklarını gösterebilirsem eğlenceli olur” diye düşündüm.
O yüzden kendi kendime Rendang'ımı tut , kodlayalım ve öğrenelim dedim .
Test Mekanizması
Bu makaledeki yazarın kıyaslama yaptığı yolu takip ediyorum:
- Basit Dize döndürülüyor.
- Bombardier kullanarak test edin — Yük testi yapmak için bir Go yardımcı programıdır. Bilgileri burada bulabilirsiniz .
- Uygulama (SUT) ve yük testi aracı için aynı makineyi kullanın.
Uygulama aşağıdaki donanım ve yazılımı kullanacaktır:
- CPU Intel i7, 4 çekirdekli
- Bellek : 16 GB
- Windows 11 Pro, sürüm 22H2
- Java 20
- düğüm 18




2 popüler Node.js web sunucusunu, 2 Java reaktif olmayan web sunucusunu ve 2 Java reaktif web sunucusunu test edeceğiz. İşte buradalar:
- Express : çok popüler bir Node.js web sunucusu.
- Fastify : en hızlı Node.js web sunucusu olduğunu iddia ediyor.
- Jetty : popüler, reaktif olmayan Java web sunucusu.
- Undertow : Springboot dahil olmak üzere birçok Java çerçevesi tarafından kullanılan başka bir geleneksel, reaktif olmayan Java web sunucusu.
- Reactor : Spring webflux'a güç sağlayan reaktif Java sunucusu.
- Vert.x-Web : başka bir popüler reaktif Java sunucusu
- Bu bilimsel bir kriter değil. Performansla ilgileniyorum - Yalnızca Saniye Başına İstek. Yukarıdaki sunucuları kullanan projeniz için bir kıyaslamaya ihtiyacınız varsa, kullanım durumunuz için bir analiz yapmalısınız. Muhtemelen daha kapsamlı bir matris toplamanız gerekir.
- Bu testin tüm kaynak kodları GitHub depomda bulunabilir. Bağlantı burada:https://github.com/mailindra/webserver-comparison.
- Java veya Node.js için performansı iyileştirmek için yapabileceğim bir şey olduğunu düşünüyorsanız, lütfen yorumda bana bildirin. Ya da daha iyisi, depomu klonlayın, kendiniz test edin ve bana bir Çekme İsteği verin.
Node.js: Ekspres
Express web sitesi, minimalist bir web çerçevesi olduğunu iddia ediyor. Aşağıda görebileceğiniz gibi, Ekspres kod basit ve bilinçlidir. Bu kıyaslamada, sunucu her istek için yalnızca "Merhaba İnsanlar" döndürür.

Uygulamayı çalıştırdıktan sonra test ediyoruz.
Önce küçük bağlantılar-küçük isteklerle, ardından 500 bağlantı ve 1 Milyon istek kullanarak. Her test için, testten önce 1 tur ısınma yaptım. İşte sonuç:
A. 50 bağlantı ve 1000 istekle test edin:

B. 500 bağlantı ve 1 Milyon istek ile test edin:

Node.js: Hızlılaştır
Fastify kodu, Express'e benzer. Web sitesi, Fastify'ın yüksek performanslı ve geliştirici dostu olduğunu iddia ediyor. İşte kod:

A. 50 bağlantı ve 1000 istek testi:

B. 500 bağlantı ve 1 Milyon istek testi:

Fastify sonuçları, Express'ten çok daha hızlı olduğunu gösteriyor. Fastify web sitesi iddiası doğru gibi görünüyor .

Java: İskele
Jetty bir Java web sunucusu ve servlet kabıdır. Reaktif değildir ancak asenkronu destekler. İşte kod:

A. 50 bağlantı ve 1000 istekle test edin:

B. 500 bağlantı ve 1 Milyon istek ile test edin:

Sonuçta görebileceğiniz gibi, Jetty oldukça iyi bir performans sergiliyor. Node.js Fastify'dan çok daha hızlıdır.
Java: Alt
Jetty gibi, Undertow da reaktif olmayan bir Java web sunucusudur. Gömülü olacak şekilde tasarlanmıştır. Aşağıda görebileceğiniz gibi, kod akıcı ve takip etmesi kolay:

A. 50 bağlantı ve 1000 istekle test edin:

B. 500 bağlantı ve 1 Milyon istek ile test edin:

Sonuçtan da görebileceğiniz gibi, Undertow her iki Node.js sunucusundan da çok daha hızlıdır. Jetty'den bile daha hızlı.
Java: Reaktör
Reactor, daha doğrusu Reactor-Netty, Spring Webflux'u çalıştıran reaktif bir web sunucusudur. Gördüğünüz gibi, kod Jetty ve Undertow'dan daha basit. Node.js'ye oldukça benziyor:

A. 50 bağlantı ve 1000 istekle test edin:

B. 500 bağlantı ve 1 Milyon istek ile test edin:

Yine Java Reactor, her iki Node.js web sunucusundan çok daha hızlı performans gösterir.
Java: Vertx-Web
Belgelerinde belirtildiği gibi Vert.x-Web, modern web uygulamaları oluşturmak için Java İsviçre Çakısıdır. Reaktif bir çerçevedir. Reactor'a benzer şekilde, kod da akıcıdır ve takip edilmesi kolaydır.

A. 50 bağlantı ve 1000 istekle test edin:

B. 500 bağlantı ve 1 Milyon istek ile test edin:

Gördüğünüz gibi, Vertx oldukça iyi bir performans sergiliyor. Node.js sunucularından ve hatta Java Reactor'dan daha iyi.
Sonuç
İyi bir görselleştirmeye sahip olabilmemiz için bu kıyaslamanın çubuk grafiğini yapıyorum:
- İlk test, 50 eşzamanlı bağlantı ve 1000 istek test sonucu:


Çözüm
- Hayır, Java, Node.js ve Javascript'ten daha yavaş değildir. Kendi başınıza bir kıyaslama yapmanın iyi yanı, kendinizi ikna edebilmenizdir. İnanmadığın şeye başkalarını inandıramazsın.
- Hem Java Reaktif hem de Reaktif Olmayan sunucular, Node.js sunucularından daha iyi performans gösterir.
- Java Engellemeyen sunucuların düşük ve yüksek eşzamanlı bağlantılarda iyi performans göstermesi ve Reactor ve Vert.x gibi reaktif sunucularla rekabet edebilmesi beni şaşırttı.
- Ekspres :https://expressjs.com/
- Sabitle :https://www.fastify.io/
- iskele :https://www.eclipse.org/jetty/
- : _https://undertow.io/
- reaktör :https://projectreactor.io/
- Vert.x-Web :https://vertx.io/docs/vertx-web/java/
- Kıyaslama deposu :https://github.com/mailindra/webserver-comparison