Express (Node.js) vs webflux (Spring): Comparação de desempenho Hello World
Uma das minhas séries de artigos populares foi a comparação de desempenho entre Node.js e Springboot. Comecei a série comparando o servidor HTTP nativo do Node com o Springboot (o artigo está aqui ). Como o artigo obteve um número recorde de visualizações, recebi comentários que:
- Um servidor nativo não deve ser comparado com um framework como o Spring
- Para comparação de maçãs com maçãs, o webflux da estrutura reativa do Spring deve ser usado em vez do threadpool do Spring
Uma observação sobre o Spring Webflux
Programação reativa é um estilo de programação que lida com fluxos de dados assíncronos ! Um modelo de desenvolvimento que se concentra em observar fluxos de dados e reagir a mudanças e propagá-las. Você aprende programação reativa para construir sistemas reativos - sistemas distribuídos altamente resilientes ou microsserviços! O Spring Webflux é um exemplo de programação reativa.
A configuração do teste é a mesma:
- MacBook M1 com 16G RAM
- Node.js v19.8.1
- Spring 3.0.4 sobre Java 17
Node.js
import express from "express";
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(port, () => console.log("Listening on", port));
O código 'hello world' do Spring Webflux foi retirado de sua documentação oficial:
HelloWorldHandler.java
package hello;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
@Component
public class HelloWorldHandler {
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromValue("Hello World!"));
}
}
package hello;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
@Configuration(proxyBeanMethods = false)
public class HelloWorldRouter {
@Bean
public RouterFunction<ServerResponse> route(HelloWorldHandler helloWorldHandler) {
return RouterFunctions
.route(GET("/"), helloWorldHandler::hello);
}
}
package hello;
import reactor.core.publisher.Mono;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.WebClient;
@Component
public class HelloWorldClient {
private final WebClient client;
public HelloWorldClient(WebClient.Builder builder) {
this.client = builder.baseUrl("http://localhost:3000").build();
}
public Mono<ClientResponse> getMessage() {
return this.client.get()
.uri("/")
.exchange();
}
}
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
HelloWorldClient helloWorldClient = context.getBean(HelloWorldClient.class);
}
}
Vamos pular direto para os resultados.
O Express é levado pelo desempenho estelar do Spring Webflux. Simplesmente não há comparação entre 70k RPS do Spring e 18K RPS do Express. Salvo menos uso de CPU e memória, o Express não está em lugar nenhum na competição.
VENCEDOR : Spring Webflux
Uma comparação do Fastify com o Spring Webflux está disponível aqui .
Obrigado por ler! Deixe-me saber quaisquer comentários, sugestões, etc.





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)