Marcio Cunha

¿Microservicios sin sincronía? Cómo usar Saga Pattern con Kafka

Aprende a coordinar transacciones distribuidas basadas en eventos en sistemas desacoplados usando Saga Pattern y Apache Kafka sin perder datos.

Marcio Cunha•4 min
También disponible en:PortuguêsEnglish
Resumen
  • Las transacciones distribuidas en microservicios exigen consistencia eventual en lugar de bloqueos estrictos
  • El patrón Saga reemplaza el control centralizado por una coreografía o una orquestación basada en eventos
  • Apache Kafka actúa como un bus de mensajes resiliente para propagar eventos y garantizar el orden
  • Las transacciones compensatorias deshacen acciones anteriores cuando ocurre un error en pasos avanzados
  • Los sistemas desacoplados mejoran la resiliencia operativa exigiendo tolerancia a la asincronía

Por qué los microservicios modernos rechazan el bloqueo de bases de datos

Cuando se divide un sistema monolítico en varios microservicios, cada componente obtiene su propia base de datos aislada. En la práctica, esto significa que las operaciones complejas, como cerrar una compra que involucra inventario, pago y facturación, dejan de ocurrir en una sola transacción atómica de la base de datos tradicional. Intentar bloquear todas estas tablas al mismo tiempo a través de la red crearía cuellos de botella insoportables y fallas en cascada. Es por esta razón que los sistemas modernos deben adoptar la consistencia eventual, aceptando que los datos tardan unos milisegundos en alinearse en toda la red. Si quieres comprender mejor los desafíos detrás de este modelo, vale la pena revisar nuestro artículo sobre cómo garantizar consistencia en arquitectura orientada a eventos.

Qué es el Saga Pattern y cómo resuelve transacciones divididas

El Saga Pattern es una secuencia de transacciones locales donde cada microservicio actualiza sus datos y publica un evento o mensaje. En la práctica, el sistema avanza paso a paso: el servicio de pedidos crea la orden y avisa a los demás, el de pagos cobra al cliente y el de inventario separa el producto. Si todo sale bien, el proceso termina con éxito. Sin embargo, si el pago es rechazado a mitad de camino, la Saga no intenta hacer un rollback mágico que deshaga todo instantáneamente en el disco. En su lugar, ejecuta transacciones compensatorias, es decir, acciones que revierten de forma lógica el efecto del paso anterior, como liberar de nuevo el inventario que había sido reservado.

Coreografía versus Orquestación: cuál elegir en Apache Kafka

Existen dos formas principales de implementar el patrón Saga: coreografía y orquestación. En la coreografía, cada microservicio escucha los eventos de Kafka, ejecuta su lógica y publica un nuevo evento por su cuenta, funcionando como un baile donde cada bailarín reacciona al movimiento del otro. En la orquestación, existe un componente centralizador que envía comandos directos a cada servicio y supervisa el progreso de todo el recorrido. Para flujos complejos con decenas de pasos, la orquestación suele evitar que el sistema se convierta en una caja negra difícil de depurar. Independientemente de tu elección, el uso de buses de mensajes eficientes es indispensable, conectando directamente con buenas prácticas discutidas en cómo diseñar arquitecturas Event-Driven sin perder transacciones.

Garantizando resiliencia y orden de eventos con Apache Kafka

Apache Kafka funciona como el sistema nervioso central de esta arquitectura, almacenando los eventos en tópicos particionados. En la práctica, cada clave de partición, como el ID del pedido, garantiza que los eventos lleguen en el orden exacto en que fueron generados para ese cliente específico. Si un microservicio se queda desconectado temporalmente debido a una caída de red o un reinicio, no pierde ningún mensaje. Tan pronto como el servicio vuelve a estar en línea, retoma el consumo del tópico desde el punto exacto donde se detuvo, procesando la compensación o la continuidad de la Saga sin intervención manual. Esta solidez operativa es fundamental para evitar estados de negocio inconsistentes.

Manejo de fallas parciales y transacciones compensatorias en la práctica

Desarrollar transacciones compensatorias exige un cuidado extremo con la idempotencia, que es la capacidad de ejecutar la misma operación varias veces sin alterar el resultado final. Imagina que un evento de compensación se entrega dos veces debido a una duplicación en la red; si la operación no es idempotente, el inventario podría ser reabastecido por duplicado por error. Para evitar este tipo de inconvenientes, cada microservicio debe registrar claves de idempotencia en sus tablas internas antes de procesar cualquier comando de Kafka. De este modo, los mensajes duplicados se descartan de forma segura, manteniendo la integridad financiera y operativa de todo el ecosistema distribuido. Para profundizar en estos conceptos arquitectónicos en producción, consulte también nuestro análisis técnico sobre IA generando código inseguro? Cómo usar AST para escaneo.

Consideraciones finales sobre consistencia eventual y sistemas desacoplados

Adoptar el Saga Pattern con Kafka transforma radicalmente la forma en que abordamos la confiabilidad en el desarrollo de software. Aunque exige un cambio de mentalidad —abandonando la ilusión de que todo ocurre de manera instantánea—, el aumento en la escalabilidad y la autonomía de los equipos compensa cada línea adicional de código de compensación. El secreto radica en diseñar los flujos pensando siempre en el peor escenario posible, asegurando que el sistema sepa recuperarse por sí mismo cuando algo falle en el camino.