Microservicios: Protocolos y Herramientas de Comunicación
Los microservicios intercambian mensajes mediante dos modelos principales: síncrono a través de peticiones HTTP directas a los endpoints de otro servicio, y asíncrono mediante brokers como Kafka o RabbitMQ. En el modelo síncrono, el emisor espera una respuesta, sabiendo la URL y los endpoints del receptor. El modelo asíncrono usa temas (topics) para almacenar mensajes sin interacción directa.
El síncrono es ideal para escenarios de petición-respuesta, mientras que el asíncrono destaca en eventos donde la entrega fiable prima sobre la velocidad.
Clientes HTTP Síncronos
Para llamadas directas, destacan varias herramientas:
- RestTemplate: Cliente bloqueante, simple pero desaconsejado en proyectos nuevos por el bloqueo de hilos.
- WebClient: Reactivo basado en Project Reactor, no bloqueante, perfecto para sistemas de alto rendimiento con procesamiento asíncrono.
- Feign Client: Declarativo: define una interfaz con anotaciones y Spring genera la implementación del cliente HTTP. Síncrono con soporte para caché, reduce el código repetitivo.
Feign lo simplifica todo: solo anota una interfaz con @GetMapping o @PostMapping y listo. WebClient lo supera en rendimiento gracias al I/O no bloqueante.
Programación Reactiva con WebClient
La reactividad en Project Reactor usa Mono (un valor único) y Flux (flujo de valores). Diferencias clave con el asíncrono tradicional:
- Maneja flujos de datos en el tiempo con backpressure: los consumidores avisan a los productores cuando están listos.
- Operadores declarativos como map, filter, flatMap y buffer para transformaciones.
- Evaluación perezosa: las operaciones se ejecutan solo al suscribirse.
Ejemplo procesando usuarios de un repositorio:
Flux<User> users = userRepository.findAll();
Flux<String> names = users
.filter(u -> u.getAge() > 18)
.map(User::getName)
.take(10);
names.subscribe(name -> {
System.out.println("Received name: " + name);
});
Aquí, las consultas a la base de datos arrancan solo con .subscribe(). Reactor se integra perfectamente con Spring WebFlux para apps web reactivas. Úsalo en cargas altas o datos en streaming; quédate con herramientas síncronas para CRUD básico.
WebSocket para Intercambio Basado en Eventos
WebSocket crea una conexión persistente para intercambio bidireccional de eventos sin peticiones repetidas. Sin ciclo petición-respuesta: los servicios envían mensajes por el canal abierto.
Ideal para:
- Chats y notificaciones en tiempo real.
- Juegos y cotizaciones bursátiles con actualizaciones instantáneas.
- Flujos de series temporales sin sondeo (polling).
Desventaja: sin garantías de entrega si cae la conexión. Todo se centra en la velocidad, no en fiabilidad absoluta.
Kafka: Broker de Mensajes Asíncrono
Kafka es un sistema distribuido para almacenar y transmitir eventos. Los productores envían a temas (logs particionados), los consumidores leen de particiones.
Garantías de entrega:
- Al menos una vez: Los mensajes llegan al menos una vez (posibles duplicados en fallos de commit).
- Exactamente una vez: Con productores idempotentes y transacciones.
La idempotencia asegura que peticiones repetidas den el mismo resultado. La replicación del broker evita pérdidas de datos. El orden se preserva dentro de particiones por clave (ej. ID de usuario).
Los grupos de consumidores distribuyen la carga: varios consumidores manejan particiones en paralelo.
Casos de uso de Kafka:
- Eventos asíncronos como emails, analítica o bonificaciones.
- Reproducir historial para recálculos.
- Streaming (Kafka Streams, CDC de bases de datos).
Desventajas: Configuración compleja del clúster (KRaft la simplifica frente a ZooKeeper) y latencia mayor que HTTP.
Lecciones Clave
- Elige Feign para llamadas síncronas simples con poco código.
- Usa WebClient para sistemas reactivos de alta carga con Flux/Mono.
- WebSocket para intercambio bidireccional en tiempo real sin garantías de entrega.
- Kafka para comunicación asíncrona fiable basada en eventos con historial completo.
- Combínalos: síncrono para CRUD, asíncrono para eventos.
— Editorial Team
Aún no hay comentarios.