Nuestra principal área de interés girará en torno a una prueba de referencia ampliamente reconocida conocida como "Hello World". Esta comparación en particular ha sido solicitada específicamente por numerosos lectores.
Configuración
Hemos realizado todas las pruebas en un MacBook Pro M2 con 16 GB de RAM, utilizando versiones de software específicas:
- Node.js v21.1.0
- Spring Boot v3.1.5 con Java v 21.0.1
- Para generar la carga HTTP, hemos utilizado la herramienta de prueba Bombardier. A continuación se muestra el código de la aplicación que utilizamos:
Aplicación Fastify (cluster)
import cluster from "node:cluster";
import Fastify from "fastify";
if (cluster.isPrimary) {
for (let i = 0; i < 8; i++) {
cluster.fork();
}
cluster.on(
"exit",
(worker, code, signal) => console.log(`worker ${worker.process.pid} died`),
);
} else {
const fastify = Fastify({ logger: false });
fastify.get("/", requestHandler);
fastify.listen({ port: 3000 });
}
function requestHandler(req, rep) {
return "Hello World!";
}
Aplicación Spring Boot (hilos virtuales)
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;
import org.springframework.context.annotation.Bean;
import java.util.concurrent.Executors;
@SpringBootApplication
@RestController
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
return protocolHandler -> {
protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
};
}
@GetMapping("/")
public String handleRequest() {
return "Hello World!";
}
}
Resultados
Todas las pruebas se ejecutan para 10 millones de peticiones utilizando 50, 100 y 300 conexiones concurrentes. Los resultados en forma de gráfico y tabla son los siguientes:
Nota: La aplicación Fastify se ha desplegado en un clúster compuesto por ocho procesos. La medición del consumo de recursos abarca la utilización combinada de todos los trabajadores del clúster.
Conclusión
En conclusión, las métricas de rendimiento de Spring Boot se vieron afectadas por algunas anomalías inesperadas en los datos, lo que provocó que tardara tres veces más que el clúster de Fastify.
Sin embargo, es importante destacar que el clúster Fastify hace un uso extensivo de los recursos del sistema, como la CPU y la memoria, lo que contribuye significativamente a su mayor uso de recursos.
Gracias por tu interés.