Comparação do servidor Web: Java é mais lento que o Node.js

May 08 2023
Realmente? Vamos codificar e comparar. Na semana passada, em pleno feriado prolongado, o Medium.

Realmente? Vamos codificar e comparar.

Foto de Ralfs Blumbergs no Unsplash

Na semana passada, em pleno feriado prolongado, o Medium.com me sugeriu este artigo . É uma comparação entre um servidor HTTP nativo Node.js e Java.

Depois disso, segui este outro benchmark Java vs Node.js do mesmo autor e, em seguida, este artigo sobre o fiasco do Java . A experiência geral de leitura me fez sentir que o Java é inferior ao Node.js. Isso me lembra um jovem desenvolvedor. Ele é jovem, ambicioso e quer transformar tudo o que toca em Javascript e Typescript.

"Java é lento", disse ele.

Bem, posso argumentar sobre isso na seção de comentários. Posso explicar como o aplicativo usa encadeamento e como o encadeamento Java é vinculado ao encadeamento do sistema operacional e como o Springboot é como um caminhão grande e você desperdiça sua capacidade. Também posso sugerir uma comparação com o framework Java reativo sem bloqueio, mostrando alguns sites que fazem benchmarks e bla..bla..bla. No final das contas, tenho certeza, não vou convencer ninguém!

“Será divertido se eu puder mostrar como eles estão errados codificando eu mesmo o benchmark”, pensei.

Então, eu disse a mim mesmo, segure meu Rendang , vamos codificar e descobrir.

Mecanismo de teste

Eu sigo a maneira como o autor daquele artigo fez o benchmark:

  • Retornando String simples.
  • Teste usando Bombardier — É um utilitário Go para fazer testes de carga. Você pode encontrar as informações aqui .
  • E use a mesma máquina para o aplicativo (SUT) e a ferramenta de teste de carga.

O aplicativo usará o seguinte hardware e software:

  • Processador Intel i7 com 4 núcleos
  • RAM: 16GB
  • Windows 11 Pro, versão 22H2
  • Java 20
  • Nó 18

Testaremos 2 servidores da Web Node.js populares, 2 servidores da Web Java não reativos e 2 servidores da Web Java reativos. Aqui estão eles:

  • Express : um servidor web Node.js muito popular.
  • Fastify : afirma ser o servidor web Node.js mais rápido.
  • Jetty : popular servidor web Java não reativo.
  • Undertow : outro servidor web Java não reativo tradicional usado por muitos frameworks Java, incluindo Springboot.
  • Reactor : servidor Java reativo que alimenta o webflux de primavera.
  • Vert.x-Web : outro servidor Java reativo popular
  • Esta não é uma referência científica. Estou interessado em desempenho — somente solicitação por segundo. Se você precisa de um benchmark para seu projeto que usa os servidores acima, você deve fazer uma análise para o seu caso de uso. Você provavelmente precisará reunir uma matriz mais abrangente.
  • Todo o código-fonte para este teste pode ser encontrado no meu repositório GitHub. Aqui está o link:https://github.com/mailindra/webserver-comparison.
  • Se você acha que há algo que eu possa fazer para melhorar o desempenho, para Java ou Node.js, informe-me no comentário. Ou melhor, clone meu repositório, teste você mesmo e me dê um Pull Request.

Node.js: Express

O site Express afirma que é uma estrutura da web minimalista. Como você pode ver abaixo, o Express code é simples e consciente. Neste benchmark, o servidor simplesmente retorna “Hello, People” para cada requisição.

Depois de executar o aplicativo, nós o testamos.

Primeiro com pequenas solicitações de conexões pequenas, depois usando 500 conexões e 1 milhão de solicitações. Para cada teste, fiz 1 rodada de aquecimento antes do teste. Aqui está o resultado:

A. Teste com 50 conexões e 1.000 solicitações:

Express testado para lidar com 50 conexões e 1000 solicitações

B. Teste com 500 conexões e 1 milhão de solicitações:

Express testado para lidar com 500 conexões e 1 milhão de solicitações

Node.js: Fastify

O código Fastify é semelhante ao Express. O site afirma que o Fastify é altamente eficiente e amigável ao desenvolvedor. Aqui está o código:

A. Teste de 50 conexões e 1.000 solicitações:

Fastify testado para lidar com 50 conexões e 1000 solicitações

B. Teste de 500 conexões e 1 milhão de solicitações:

Fastify testado para lidar com 500 conexões e 1 milhão de solicitações

Os resultados do Fastify mostram que é muito mais rápido que o Express. A alegação do site Fastify parece estar correta .

Java: Cais

Jetty é um servidor web Java e contêiner de servlet. É não reativo, mas suporta assíncrono. Aqui está o código:

A. Teste com 50 conexões e 1.000 solicitações:

Jetty testado para lidar com 50 conexões e 1000 solicitações

B. Teste com 500 conexões e 1 milhão de solicitações:

Jetty testado para lidar com 500 conexões e 1 milhão de solicitações

Como você pode ver no resultado, o Jetty tem um desempenho muito bom. É muito mais rápido que o node.js Fastify.

Java: Ressaca

Assim como o Jetty, o Undertow é um servidor web Java não reativo. Ele é projetado para ser incorporável. Como você pode ver abaixo, o código é fluente e fácil de seguir:

A. Teste com 50 conexões e 1.000 solicitações:

Undertow testado para lidar com 50 conexões e 1000 solicitações

B. Teste com 500 conexões e 1 milhão de solicitações:

Undertow testado para lidar com 500 conexões e 1 milhão de solicitações

Você pode ver a partir do resultado, Undertow é muito mais rápido do que ambos os servidores Node.js. É ainda mais rápido que o Jetty.

Java: reator

O Reactor, para ser preciso, o Reactor-Netty, é um servidor web reativo que alimenta o Spring Webflux. Como você pode ver, o código é mais simples que Jetty e Undertow. Parece bastante semelhante ao Node.js:

A. Teste com 50 conexões e 1.000 solicitações:

Reator testado para lidar com 50 conexões e 1000 solicitações

B. Teste com 500 conexões e 1 milhão de solicitações:

Reactor testado para lidar com 500 conexões e 1 milhão de solicitações

Novamente, o Java Reactor executa muito mais rápido do que os dois servidores da web Node.js.

Java: Vertx-Web

Conforme declarado em sua documentação , o Vert.x-Web é o canivete do exército suíço Java para a construção de aplicativos da Web modernos. É um quadro reativo. Semelhante ao Reactor, o código também é fluente e fácil de seguir.

A. Teste com 50 conexões e 1.000 solicitações:

Vertx-Web testado para lidar com 50 conexões e 1000 solicitações

B. Teste com 500 conexões e 1 milhão de solicitações:

Vertx-web testado para lidar com 500 conexões e 1 milhão de solicitações

Como você pode ver, Vertx funciona muito bem. Melhor que os servidores Node.js e ainda melhor que o Java Reactor.

Resultado

Para termos uma boa visualização, faço o gráfico de barras deste benchmark:

  1. Primeiro teste, resultado de teste de 50 conexões simultâneas e 1000 solicitações:
  2. 50 conexões simultâneas e 1 mil solicitações (por: Ronny Mailindra)
Benchmark de resultado final (por: Ronny Mailindra)

Conclusão

  1. Não, Java não é mais lento que Node.js e Javascript. O bom de fazer um benchmark sozinho é que você pode se convencer. Você não pode convencer os outros daquilo em que não acredita.
  2. Os servidores Java Reactive e Non-Reactive têm melhor desempenho do que os servidores Node.js.
  3. Surpreende-me que os servidores Java Non-blocking tenham um bom desempenho em conexões simultâneas baixas e altas e possam competir com o servidor reativo, como Reactor e Vert.x.
  • Expresso :https://expressjs.com/
  • Fastificar :https://www.fastify.io/
  • Molhe :https://www.eclipse.org/jetty/
  • Ressaca :https://undertow.io/
  • Reator :https://projectreactor.io/
  • Vert.x-Web :https://vertx.io/docs/vertx-web/java/
  • Repositório de referência :https://github.com/mailindra/webserver-comparison