Programación Reactiva con Spring WebFlux

Elliot Luque
2 min

En el desarrollo de backend tradicional con Spring MVC, cada petición es gestionada por un hilo dedicado (Thread-per-request). Aunque esto funciona bien para la mayoría de los casos, se vuelve ineficiente cuando tenemos miles de conexiones simultáneas que pasan mucho tiempo esperando respuestas de Base de Datos o APIs externas. Aquí es donde entra Spring WebFlux.

¿Qué es el paradigma reactivo?

La programación reactiva se basa en flujos de datos asíncronos y no bloqueantes. En lugar de esperar a que una operación termine, el hilo se libera para atender otras peticiones. Cuando el dato está listo, se notifica y se continúa el procesamiento.

Flux y Mono: Los pilares de Project Reactor

WebFlux utiliza Project Reactor como motor reactivo, introduciendo dos tipos principales:

  • Mono: Representa un flujo de 0 o 1 elemento.
  • Flux: Representa un flujo de 0 a N elementos.

Un ejemplo práctico

Compara estas dos formas de obtener datos de un servicio externo:

Enfoque Bloqueante (Spring MVC)

src/controllers/userController.java
@GetMapping("/usuario/{id}")
public Usuario getUser(@PathVariable String id) {
// El hilo se queda bloqueado esperando la respuesta de la DB
return userRepository.findById(id)
}

Enfoque No Bloqueante (Spring WebFlux)

src/controllers/userController.java
@GetMapping("/usuario/{id}")
public Mono<Usuario> getUser(@PathVariable String id) {
// El hilo se libera inmediatamente.
// La respuesta se enviará cuando los datos estén listos.
return userRepository.findById(id);
}

¿Cuándo deberías usar WebFlux?

No es una bala de plata. Deberías considerar WebFlux si:

  1. Alta concurrencia: Necesitas manejar una gran cantidad de conexiones con pocos recursos de hardware.
  2. Streaming de datos: Tu aplicación necesita enviar datos en tiempo real (Server-Sent Events o WebSockets).
  3. Microservicios intensivos en E/S: Si tu servicio pasa el 90% del tiempo esperando respuestas de otros servicios.

Desafíos del mundo reactivo

El cambio de paradigma no es gratis. Hay varios retos a considerar:

  • Curva de aprendizaje: El código imperativo es más fácil de depurar y seguir.
  • RDBMs tradicionales: No todas las bases de datos tienen drivers reactivos maduros (aunque R2DBC está mejorando mucho esto).
  • Librerías de terceros: Si una librería bloquea, romperá los beneficios del bucle de eventos (Event Loop) de Netty.

Conclusión

Spring WebFlux no viene a reemplazar a Spring MVC, sino a complementarlo. Para aplicaciones CRUD sencillas, MVC sigue siendo el rey por su simplicidad. Pero si estás construyendo el próximo sistema de notificaciones masivas o un gateway de alta performance, el paradigma reactivo es tu mejor aliado.