Confronto server Web: Java è più lento di Node.js
Veramente? Codifichiamo e confrontiamo.
La settimana scorsa, nel bel mezzo di una lunga vacanza, Medium.com mi ha suggerito questo articolo . È un confronto tra un server HTTP nativo Node.js e Java.
Successivamente, ho seguito questo altro benchmark Java vs Node.js dello stesso autore e poi questo articolo sul fiasco di Java . L'esperienza di lettura complessiva mi ha fatto sentire che Java è inferiore rispetto a Node.js. Mi ricorda un giovane sviluppatore. È giovane, ambizioso e vuole trasformare tutto ciò che tocca in Javascript e Typescript.
"Java è lento", ha detto.
Bene, posso discuterne nella sezione dei commenti. Potrei spiegare come l'applicazione utilizza il thread e come il thread Java è associato al thread del sistema operativo e come Springboot è come un grosso camion e ne sprechi le capacità. Posso anche suggerire di confrontarlo con il framework Java reattivo non bloccante, mostrando alcuni siti Web che fanno benchmark e bla..bla..bla. Alla fine, ne sono certo, non convincerò nessuno!
"Sarà divertente se riesco a mostrare quanto si sbagliano codificando io stesso il benchmark", ho pensato.
Quindi, mi sono detto, tieni il mio Rendang , codifichiamo e scopriamolo.
Meccanismo di prova
Seguo il modo in cui l'autore in quell'articolo ha fatto il benchmark:
- Restituzione di una stringa semplice.
- Test utilizzando Bombardier: è un'utilità Go per eseguire test di carico. Puoi trovare le informazioni qui .
- E usa la stessa macchina per l'applicazione (SUT) e lo strumento di test del carico.
L'applicazione utilizzerà il seguente hardware e software:
- CPU Intel i7 con 4 core
- RAM: 16GB
- Windows 11 Pro, versione 22H2
- Giava 20
- Nodo 18




Testeremo 2 server Web Node.js popolari, 2 server Web non reattivi Java e 2 server Web reattivi Java. Eccoli:
- Express : un server Web Node.js molto popolare.
- Fastify : afferma di essere il server Web Node.js più veloce.
- Jetty : popolare server web Java non reattivo.
- Undertow : un altro web server Java tradizionale non reattivo utilizzato da molti framework Java, incluso Springboot.
- Reactor : server Java reattivo che alimenta il webflux primaverile.
- Vert.x-Web : un altro popolare server Java reattivo
- Questo non è un punto di riferimento scientifico. Sono interessato alle prestazioni: solo richiesta al secondo. Se hai bisogno di un benchmark per il tuo progetto che utilizza i server di cui sopra, dovresti fare un'analisi per il tuo caso d'uso. Probabilmente hai bisogno di raccogliere una matrice più completa.
- Tutto il codice sorgente per questo test può essere trovato sul mio repository GitHub. Ecco il link:https://github.com/mailindra/webserver-comparison.
- Se pensi che ci sia qualcosa che posso fare per migliorare le prestazioni, per Java o Node.js, fammelo sapere nel commento. O meglio, clona il mio repository, testalo tu stesso e fammi una Pull Request.
Node.js: espresso
Il sito Web Express afferma che si tratta di un framework Web minimalista. Come puoi vedere di seguito, il codice Express è semplice e consapevole. In questo benchmark, il server restituisce semplicemente "Hello, People" per ogni richiesta.

Dopo aver eseguito l'applicazione, la testiamo.
Prima con piccole connessioni-piccole richieste, poi utilizzando 500 connessioni e 1 milione di richieste. Per ogni test, ho fatto 1 round di riscaldamento prima del test. Ecco il risultato:
A. Test con 50 connessioni e 1000 richieste:

B. Test con 500 connessioni e 1 milione di richieste:

Node.js: velocizza
Il codice Fastify è simile a Express. Il sito Web afferma che Fastify è altamente performante e adatto agli sviluppatori. Ecco il codice:

A. Test di 50 connessioni e 1000 richieste:

B. Test di 500 connessioni e 1 milione di richieste:

I risultati di Fastify mostrano che è molto più veloce di Express. L'affermazione del sito Fastify sembra essere corretta .

Java: molo
Jetty è un server Web Java e un contenitore servlet. Non è reattivo ma supporta l'asincrono. Ecco il codice:

A. Test con 50 connessioni e 1000 richieste:

B. Test con 500 connessioni e 1 milione di richieste:

Come puoi vedere nel risultato, Jetty si comporta abbastanza bene. È molto più veloce di node.js Fastify.
Java: risacca
Come Jetty, Undertow è un server Web Java non reattivo. È progettato per essere incorporabile. Come puoi vedere di seguito, il codice è fluido e facile da seguire:

A. Test con 50 connessioni e 1000 richieste:

B. Test con 500 connessioni e 1 milione di richieste:

Come puoi vedere dal risultato, Undertow è molto più veloce di entrambi i server Node.js. È persino più veloce di Jetty.
Giava: reattore
Reactor, per la precisione Reactor-Netty, è un web server reattivo che alimenta Spring Webflux. Come puoi vedere, il codice è più semplice di Jetty e Undertow. Sembra abbastanza simile a Node.js:

A. Test con 50 connessioni e 1000 richieste:

B. Test con 500 connessioni e 1 milione di richieste:

Ancora una volta, Java Reactor funziona molto più velocemente di entrambi i server Web Node.js.
Java: Vertx Web
Come affermato nella sua documentazione , Vert.x-Web è il coltellino svizzero Java per la creazione di applicazioni Web moderne. È un quadro reattivo. Simile a Reactor, anche il codice è fluido e facile da seguire.

A. Test con 50 connessioni e 1000 richieste:

B. Test con 500 connessioni e 1 milione di richieste:

Come puoi vedere, Vertx si comporta abbastanza bene. Meglio dei server Node.js e persino meglio di Java Reactor.
Risultato
Quindi possiamo avere una buona visualizzazione, creo il grafico a barre di questo benchmark:
- Primo test, risultato del test di 50 connessioni simultanee e 1000 richieste:


Conclusione
- No, Java non è più lento di Node.js e Javascript. La cosa buona di fare un benchmark da solo è che puoi convincerti. Non puoi convincere gli altri della cosa in cui non credi.
- Entrambi i server Java reattivi e non reattivi funzionano meglio dei server Node.js.
- Mi sorprende che i server Java non bloccanti funzionino bene con connessioni simultanee basse e alte e possano competere con il server reattivo come Reactor e Vert.x.
- Esprimere :https://expressjs.com/
- Fastificare :https://www.fastify.io/
- Molo :https://www.eclipse.org/jetty/
- Risacca :https://undertow.io/
- Reattore :https://projectreactor.io/
- Vert.x-Web :https://vertx.io/docs/vertx-web/java/
- Deposito di riferimento :https://github.com/mailindra/webserver-comparison