Comparaison des serveurs Web : Java est plus lent que Node.js
Vraiment? Codons et comparons.
La semaine dernière, en pleines vacances, Medium.com m'a proposé cet article . Il s'agit d'une comparaison entre un serveur HTTP natif Node.js et Java.
Après cela, j'ai suivi cet autre benchmark Java vs Node.js du même auteur puis cet article sur le fiasco Java . L'expérience de lecture globale m'a fait sentir que Java est inférieur face à Node.js. Cela me rappelle un jeune développeur. Il est jeune, ambitieux et veut transformer tout ce qu'il touche en Javascript et Typescript.
"Java est lent", a-t-il déclaré.
Eh bien, je peux en discuter dans la section des commentaires. Je pourrais expliquer comment l'application utilise le thread, et comment le thread Java est lié au thread du système d'exploitation, et comment Springboot est comme un gros camion et vous gaspillez ses capacités. Je peux également suggérer de le comparer avec le framework Java réactif non bloquant, en montrant certains sites Web qui font des benchmarks et bla..bla..bla. Au bout du compte, j'en suis sûr, je ne convaincrai personne !
"Ce sera amusant si je peux montrer à quel point ils se trompent en codant moi-même la référence", ai-je pensé.
Alors, je me suis dit, tiens mon Rendang , codez et découvrez.
Mécanisme de test
Je suis la façon dont l'auteur de cet article a fait le benchmark :
- Renvoie une chaîne simple.
- Test à l'aide de Bombardier - Il s'agit d'un utilitaire Go pour effectuer des tests de charge. Vous pouvez trouver les informations ici .
- Et utilisez la même machine pour l'application (SUT) et l'outil de test de charge.
L'application utilisera le matériel et les logiciels suivants :
- Processeur Intel i7 avec 4 cœurs
- RAM : 16 Go
- Windows 11 Pro, version 22H2
- Java 20
- Nœud 18




Nous testerons 2 serveurs Web Node.js populaires, 2 serveurs Web non réactifs Java et 2 serveurs Web réactifs Java. Les voici:
- Express : un serveur web Node.js très populaire.
- Fastify : il prétend être le serveur Web Node.js le plus rapide.
- Jetty : serveur Web Java non réactif populaire.
- Undertow : un autre serveur Web Java traditionnel non réactif utilisé par de nombreux frameworks Java, dont Springboot.
- Reactor : serveur Java réactif qui alimente le spring webflux.
- Vert.x-Web : un autre serveur Java réactif populaire
- Ce n'est pas une référence scientifique. Je suis intéressé par les performances — Requête par seconde uniquement. Si vous avez besoin d'une référence pour votre projet qui utilise les serveurs ci-dessus, vous devez effectuer une analyse de votre cas d'utilisation. Vous avez probablement besoin de rassembler une matrice plus complète.
- Tout le code source de ce test se trouve sur mon dépôt GitHub. Voici le lien:https://github.com/mailindra/webserver-comparison.
- Si vous pensez que je peux faire quelque chose pour améliorer les performances, pour Java ou Node.js, faites-le moi savoir dans le commentaire. Ou mieux, clonez mon référentiel, testez-le par vous-même et envoyez-moi une demande d'extraction.
Node.js : Express
Le site Web Express affirme qu'il s'agit d'un cadre Web minimaliste. Comme vous pouvez le voir ci-dessous, le code Express est simple et conscient. Dans ce benchmark, le serveur renvoie simplement "Hello, People" pour chaque requête.

Après avoir exécuté l'application, nous la testons.
D'abord avec de petites connexions-petites requêtes, puis en utilisant 500 connexions et 1 million de requêtes. Pour chaque test, j'ai fait 1 tour d'échauffement avant le test. Voici le résultat :
A. Test avec 50 connexions et 1000 requêtes :

B. Test avec 500 connexions et 1 million de requêtes :

Node.js : Fastifier
Le code Fastify ressemble à Express. Le site Web affirme que Fastify est très performant et convivial pour les développeurs. Voici le code :

A. Test de 50 connexions et 1000 requêtes :

B. 500 connexions et 1 million de requêtes testées :

Les résultats de Fastify montrent qu'il est beaucoup plus rapide qu'Express. La revendication du site Web Fastify semble être correcte .

Java : jetée
Jetty est un serveur Web Java et un conteneur de servlets. Il est non réactif mais prend en charge l'asynchrone. Voici le code :

A. Test avec 50 connexions et 1000 requêtes :

B. Test avec 500 connexions et 1 million de requêtes :

Comme vous pouvez le voir dans le résultat, Jetty fonctionne plutôt bien. C'est beaucoup plus rapide que node.js Fastify.
Java : ressac
Comme Jetty, Undertow est un serveur Web Java non réactif. Il est conçu pour être intégrable. Comme vous pouvez le voir ci-dessous, le code est fluide et facile à suivre :

A. Test avec 50 connexions et 1000 requêtes :

B. Test avec 500 connexions et 1 million de requêtes :

Vous pouvez voir d'après le résultat, Undertow est bien plus rapide que les deux serveurs Node.js. C'est encore plus rapide que Jetty.
Java : réacteur
Reactor, pour être précis Reactor-Netty, est un serveur Web réactif qui a propulsé Spring Webflux. Comme vous pouvez le voir, le code est plus simple que Jetty et Undertow. Il ressemble assez à Node.js :

A. Test avec 50 connexions et 1000 requêtes :

B. Test avec 500 connexions et 1 million de requêtes :

Encore une fois, Java Reactor fonctionne beaucoup plus rapidement que les deux serveurs Web Node.js.
Java : Vertx Web
Comme indiqué dans sa documentation , Vert.x-Web est le couteau suisse Java pour la création d'applications Web modernes. C'est un cadre réactif. Semblable à Reactor, le code est également fluide et facile à suivre.

A. Test avec 50 connexions et 1000 requêtes :

B. Test avec 500 connexions et 1 million de requêtes :

Comme vous pouvez le voir, Vertx fonctionne assez bien. Mieux que les serveurs Node.js, et encore mieux que Java Reactor.
Résultat
Pour qu'on puisse avoir une bonne visualisation, je fais le bargraph de ce benchmark :
- Premier test, un résultat de test de 50 connexions simultanées et 1000 requêtes :


Conclusion
- Non, Java n'est pas plus lent que Node.js et Javascript. La bonne chose à propos de faire un benchmark par vous-même est que vous pouvez vous convaincre. Vous ne pouvez pas convaincre les autres de ce que vous ne croyez pas.
- Les serveurs Java réactifs et non réactifs fonctionnent mieux que les serveurs Node.js.
- Cela me surprend que les serveurs Java non bloquants fonctionnent bien dans les connexions simultanées faibles et élevées et puissent rivaliser avec les serveurs réactifs tels que Reactor et Vert.x.
- Express :https://expressjs.com/
- Fastifier :https://www.fastify.io/
- Jetée :https://www.eclipse.org/jetty/
- ressac :https://undertow.io/
- Réacteur :https://projectreactor.io/
- Vert.x-Web :https://vertx.io/docs/vertx-web/java/
- Référentiel de référence :https://github.com/mailindra/webserver-comparison