Si imaginas un sistema distribuido como una gran orquesta musical, tienes dos enfoques para gestionar su ejecución: orquestación y coreografía.
- Orquestación — es cuando tienes un director (componente centralizado) que controla y dirige las acciones de cada instrumento (microservicio). Él determina cuándo y quién debe tocar su parte.
- Coreografía — es como un baile improvisado, donde los instrumentos (microservicios) interactúan entre sí directamente, sin órdenes de un director. Cada servicio simplemente reacciona a los eventos que ocurren en el sistema.
Diferencias entre orquestación y coreografía
| Aspecto | Orquestación | Coreografía |
|---|---|---|
| Enfoque | Gestión centralizada | Interacción descentralizada |
| Coordinador | Hay un coordinador principal | No hay coordinador principal |
| Flexibilidad | Menos flexible, requiere cambios en el director | Alta flexibilidad, se pueden añadir fácilmente nuevos eventos |
| Facilidad de depuración | Más fácil de depurar, los cambios son centralizados | Más difícil de depurar debido a la descentralización |
| Ejemplos | BPMN, Camunda | Kafka, RabbitMQ |
Orquestación de Sagas
En el caso de la orquestación hay un componente central que gestiona todos los pasos de la saga. Es una especie de "coordinador de la saga". Sabe qué acciones hay que ejecutar, en qué orden, y qué hacer si algo sale mal.
Por ejemplo, si quieres implementar el proceso de hacer un pedido, el coordinador gestionará:
- La creación del pedido.
- La reserva de productos en el almacén.
- La emisión de la factura al cliente.
Si en uno de estos pasos algo sale mal, el coordinador dirá: "Ok, cancelamos el pedido".
Ventajas de la orquestación
- Simplicidad de gestión: todos los pasos se gestionan de forma centralizada, lo que facilita entender el proceso completo.
- Más fácil de depurar: los logs del coordinador te ayudan a rastrear dónde ocurrió el error.
- Apto para procesos complejos: cómodo cuando tienes un proceso complejo con muchos pasos.
Desventajas de la orquestación
- Punto único de fallo: si el coordinador falla, el proceso se detiene.
- Menor flexibilidad: añadir nuevos pasos o cambios requiere modificar al coordinador.
Herramientas para orquestación
Algunas herramientas populares para orquestación:
- Camunda: es un motor BPMN potente que permite modelar y gestionar procesos.
- Zeebe: es una herramienta más moderna, desarrollada por el mismo equipo que Camunda, pero más ligera y orientada a microservicios.
Coreografía de Sagas
En el modelo de coreografía no tienes un centro de control único. En su lugar, los microservicios reaccionan a los eventos que ocurren a su alrededor. Por ejemplo, en el proceso de hacer un pedido:
- El servicio de creación de pedidos publica el evento
OrderCreated. - El servicio de gestión de inventario recibe ese evento e intenta reservar los productos. Si tiene éxito, publica el evento
StockReserved. - El servicio de facturación procesa el evento
StockReservedy emite la factura al cliente.
Cada servicio se hace cargo de su parte del trabajo, y la conexión se hace mediante intercambio de eventos.
Ventajas de la coreografía
- Flexibilidad: puedes añadir fácilmente un nuevo servicio que reaccione a eventos existentes.
- Alta escalabilidad: no hay un único punto de fallo.
- Asincronía: permite procesar cada parte del proceso de forma independiente.
Desventajas de la coreografía
- Dificultad para depurar: es más difícil entender dónde falló algo, porque el proceso está distribuido.
- Falta de "conocimiento" centralizado: es complicado tener una visión completa del estado actual de la saga.
Herramientas para coreografía
Herramientas que encajan bien para gestionar eventos:
- Apache Kafka: ofrece una plataforma de publicación/suscripción de eventos.
- RabbitMQ: otro sistema de mensajería muy popular.
- Eventuate: plataforma creada específicamente para implementar coreografías en sistemas orientados a eventos.
¿Cuándo usar orquestación y cuándo coreografía?
Ambos enfoques tienen sus puntos fuertes y débiles. La elección depende de tu caso de negocio, la escala del sistema y los requisitos de tolerancia a fallos.
Usa orquestación si:
- Tu lógica de negocio es compleja y se necesita un control estricto sobre los pasos del proceso.
- Necesitas tener una gestión centralizada del proceso.
Usa coreografía si:
- Tus procesos son lo bastante autónomos y quieres minimizar dependencias entre servicios.
- La flexibilidad y la posibilidad de añadir/ cambiar pasos sin tocar todo el sistema son importantes.
Ejemplo de implementación: Hacer un pedido
Escenario
Imagina que tenemos un proceso de hacer un pedido que consta de los pasos:
- Creación del pedido.
- Reserva de productos.
- Emisión de la factura.
- Envío de notificación al cliente.
Implementación por orquestación
@Component
public class OrderSagaOrchestrator {
// Inyectamos los servicios para ejecutar los pasos
@Autowired
private InventoryService inventoryService;
@Autowired
private BillingService billingService;
@Autowired
private NotificationService notificationService;
public void startOrderSaga(Order order) {
try {
// Paso 1: Reservamos productos
inventoryService.reserveStock(order);
// Paso 2: Emitimos la factura
billingService.createInvoice(order);
// Paso 3: Notificamos al cliente
notificationService.sendOrderConfirmation(order);
} catch (Exception e) {
// Si algo sale mal, hacemos la compensación
inventoryService.releaseStock(order);
}
}
}
Implementación por coreografía
// El servicio de pedidos publica el evento
@Component
public class OrderService {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void createOrder(Order order) {
// Lógica de creación de pedido...
// Publicamos el evento
kafkaTemplate.send("order-topic", "OrderCreated", order.getId());
}
}
// El servicio de inventario procesa el evento "OrderCreated"
@Component
@KafkaListener(topics = "order-topic")
public class InventoryService {
@KafkaHandler
public void handleOrderCreated(String orderId) {
// Lógica de reserva de stock...
// Publicamos el evento "StockReserved"
kafkaTemplate.send("inventory-topic", "StockReserved", orderId);
}
}
// El servicio de facturación procesa el evento "StockReserved"
@Component
@KafkaListener(topics = "inventory-topic")
public class BillingService {
@KafkaHandler
public void handleStockReserved(String orderId) {
// Lógica de emisión de factura...
// Publicamos el evento "InvoiceCreated"
kafkaTemplate.send("billing-topic", "InvoiceCreated", orderId);
}
}
Conclusiones
Orquestación y coreografía son dos enfoques distintos para gestionar procesos complejos en una arquitectura de microservicios. Cada uno tiene sus pros y sus contras, y la elección depende del caso de negocio concreto. Para construir un sistema fiable, escalable y tolerante a fallos, a menudo se usan ambos enfoques dentro de la misma aplicación. Por ejemplo, los procesos complejos pueden gestionarse mediante orquestación, y los procesos sencillos mediante coreografía.
GO TO FULL VERSION