Orchestration
Orquestación en Acción: Manejo de Rutas No Tan Felices en Sistemas de Software Modernos
En un mundo ideal, la arquitectura de software sería sencilla si solo existieran rutas felices, pero las aplicaciones del mundo real son complejas. Las arquitecturas modernas tienen muchas piezas móviles, rutas y servicios que interactúan entre sí. Además, deben manejar diferentes condiciones y errores.
Una forma efectiva de gestionar estas complejidades es a través de la orquestación.
¿Qué es la Orquestación?
La orquestación es un patrón utilizado para coordinar la ejecución de servicios distribuidos para completar un proceso de negocio. Se utiliza típicamente cuando varios servicios independientes deben trabajar juntos para completar una tarea. Algunos los llaman transacciones orquestadas.
¿Por Qué Necesitamos la Orquestación?
En los sistemas de software modernos, especialmente aquellos construidos sobre arquitecturas de microservicios, los flujos de trabajo a menudo involucran múltiples servicios que deben trabajar juntos. Cada servicio puede tener su propia lógica de datos y negocios, y para completar un flujo de trabajo, el sistema necesita coordinar las interacciones entre estos servicios.
Sin un mecanismo central para gestionar estas interacciones, la complejidad y el potencial de errores aumentan significativamente. La orquestación aborda estos desafíos proporcionando un mecanismo de control centralizado que:
- Gestiona el flujo de trabajo
- Asegura que se llame a cada servicio en el orden correcto
- Maneja los errores de manera adecuada
Este control centralizado facilita la gestión de flujos de trabajo complejos, el manejo de errores y la garantía de consistencia entre los servicios.
Características Clave de la Orquestación
Control Centralizado
La orquestación proporciona un punto único de control para todas las decisiones del flujo de trabajo. Esta entidad central es el Orquestador, que gestiona la secuencia de invocaciones de servicios y controla la lógica para la recuperación de errores, reintentos y gestión de estados.
Interacción de Servicios
El orquestador interactúa con muchos servicios, llamándolos en un orden específico y manejando el flujo de datos entre ellos. Esta interacción puede ser síncrona (esperando una respuesta) o asíncrona (continuando sin esperar una respuesta).
Gestión de Estados
El orquestador mantiene el estado del flujo de trabajo, rastreando qué pasos se han completado, su estado actual y qué se necesita hacer a continuación. Esta gestión de estados es crucial para manejar flujos de trabajo complejos y garantizar la consistencia.
Extensibilidad
Puedes extender los flujos de trabajo orquestados agregando o modificando nuevos servicios y actualizando el orquestador central para acomodar los cambios sin una interrupción significativa del sistema.
Manejo de Errores y Compensación
La orquestación permite una lógica sofisticada de manejo de errores y compensación. Si algo sale mal, el orquestador puede ejecutar reintentos, usar flujos de trabajo alternativos para manejar la falla o revertir operaciones. Este es uno de los puntos fuertes de la orquestación en el diseño de sistemas.
Manejo de Rutas con Orquestación: Un Ejemplo Práctico
En este ejemplo, exploramos cómo la orquestación puede gestionar el flujo de trabajo de un sistema de comercio electrónico que involucra muchos servicios.
Para este ejemplo, nos enfocaremos en:
- Pedidos
- Envíos
- Notificaciones
Ruta Feliz
1. Cliente Realiza un Pedido: El proceso comienza cuando el cliente envía una solicitud de "Realizar Pedido" al Orquestador de Pedidos.
2. Creación de Pedido: El Orquestador de Pedidos recibe la solicitud y la reenvía al Servicio de Pedidos para crear el pedido. El Servicio de Pedidos procesa la solicitud y crea un nuevo registro de pedido en su base de datos.
3. Solicitud de Envío: Una vez que el Servicio de Pedidos confirma la creación del pedido, el orquestador llama de manera asíncrona al Servicio de Envíos para iniciar el proceso de envío. Esto se hace porque el envío del pedido toma tiempo y no necesita bloquear el flujo de trabajo.
4. Pedido Enviado: El Servicio de Envíos procesa la solicitud de envío. Después de que el pedido es enviado, notifica al orquestador sobre el envío exitoso.
5. Actualización del Estado del Pedido: Al recibir la confirmación de envío, el orquestador actualiza el estado del pedido a "Enviado" en el Servicio de Pedidos.
6. Notificación: Finalmente, el orquestador llama al Servicio de Notificaciones para enviar un correo electrónico de éxito informando al cliente que su pedido ha sido enviado.
Ruta No Tan Feliz (Flujo Alternativo)
1. Cliente Realiza un Pedido: El cliente envía una solicitud de "Realizar Pedido" al Orquestador de Pedidos.
2. Creación de Pedido: El Orquestador de Pedidos reenvía la solicitud al Servicio de Pedidos, que crea el pedido.
3. Solicitud de Envío: El orquestador llama de manera asíncrona al Servicio de Envíos para iniciar el proceso de envío.
4. Notificación de Pedido Pendiente: El Servicio de Envíos encuentra que no hay suficiente inventario para cumplir con el pedido y notifica al orquestador sobre el estado de pedido pendiente.
5. Actualización del Estado del Pedido: El orquestador actualiza el estado del pedido a "Pendiente" en el Servicio de Pedidos para reflejar el problema.
6. Notificación: El orquestador llama al Servicio de Notificaciones para enviar una notificación de pedido pendiente al cliente, informándoles sobre el problema con su pedido.
Ruta Fallida (Transacciones Compensatorias)
Cuando ocurre un error durante una transacción, puede ser necesario deshacer los pasos completados previamente para mantener la consistencia del sistema. A esto lo llamamos transacciones compensatorias. Por ejemplo, en sistemas sin soporte para pedidos pendientes, esto se vería así:
1. Cliente Realiza un Pedido: El cliente envía una solicitud de "Realizar Pedido" al Orquestador de Pedidos.
2. Creación de Pedido: El orquestador llama al Servicio de Pedidos para crear el pedido.
3. Solicitud de Envío: El orquestador llama al Servicio de Envíos para procesar el envío.
4. Problema de Inventario: El Servicio de Envíos detecta inventario insuficiente para cumplir con el pedido y notifica al orquestador.
5. Transacciones Compensatorias Iniciadas:
- Cancelar Pedido: El orquestador llama al Servicio de Pedidos para cancelar el pedido.
- Revertir Pago: Si se procesó el pago, el orquestador podría necesitar enviar un mensaje al Servicio de Pagos para reembolsar el monto al cliente.
- Actualización del Estado del Pedido: El orquestador actualiza el estado del pedido a "Cancelado" en el Servicio de Pedidos.
6. Notificación: El orquestador envía una notificación de cancelación a través del Servicio de Notificaciones.
No Todas las Operaciones son Sincrónicas
Como se mencionó, esta interacción puede ser asíncrona. Mientras que el concepto de orquestación sugiere un controlador centralizado y pasos definidos, es importante notar que no todos los orquestadores operan de manera sincrónica. La orquestación impulsada por eventos es una arquitectura que puedes usar para implementar la Orquestación de Microservicios de una manera totalmente asíncrona.
El orquestador sigue siendo responsable de la lógica del flujo de trabajo y de las fallas en ambos casos. Lo único que cambia es cómo el orquestador se comunica con los microservicios descendentes.
Beneficios de los Flujos de Trabajo Impulsados por Eventos
- Puedes usar la misma funcionalidad de monitoreo y escalado para el orquestador que para otros microservicios impulsados por eventos.
- Los eventos pueden ser consumidos por otros servicios, incluidos aquellos fuera de la orquestación.
- El orquestador y los servicios dependientes están aislados de las fallas intermitentes entre sí.
- Tienen un mecanismo de reintento incorporado para fallas, ya que los eventos pueden permanecer en el broker para reintentos.
El orquestador puede seguir procesando otras tareas mientras espera las respuestas de los servicios. Este enfoque es particularmente valioso en sistemas distribuidos donde las latencias de los servicios pueden variar y las cargas de trabajo pueden ser impredecibles. El orquestador tiene la responsabilidad de materializar y mantener el estado de los eventos.
En este caso, el evento 123 (una representación de un pedido, por ejemplo) ha sido procesado con éxito, mientras que los IDs de eventos 124 y 125 están en diferentes etapas del flujo de trabajo. El orquestador puede tomar decisiones basadas en estos resultados y seleccionar el siguiente paso según la lógica del flujo de trabajo. Una vez que los eventos son procesados, el orquestador también puede tomar los datos necesarios de los resultados de los servicios A, B y C y componer el resultado final.
Suponiendo que las operaciones en los servicios A, B y C sean independientes entre sí, puedes cambiar el flujo de trabajo modificando el orden en que envías los eventos. Además, ten en cuenta que habrá muchas oportunidades para combinar llamadas directas y flujos impulsados por eventos dentro del mismo orquestador, y esta combinación será tu punto ideal.
Beneficios y Desventajas de la Orquestación
Beneficios de la Orquestación
- Centralización: El orquestador actúa como una entidad centralizada donde se implementan todos los comportamientos, rutas y lógica de manejo de errores. Esta centralización simplifica la gestión de los flujos de trabajo al proporcionar un único lugar para gestionar todas las interacciones y decisiones.
- Resiliencia: El orquestador puede incorporar lógica de reintento para manejar caídas temporales de servicios. Si un servicio no está disponible momentáneamente, el orquestador puede reintentar la solicitud después de un intervalo especificado, mejorando la resiliencia y confiabilidad del sistema. Este mecanismo de reintento permite que el sistema degrade graciosamente en lugar de fallar completamente, mejorando la experiencia del usuario durante fallas transitorias.
- Gestión de Estados: El orquestador mantiene el estado del flujo de trabajo, lo que facilita la consulta del estado actual de un proceso en curso. Esta gestión de estados es crítica para el monitoreo, la depuración y la comprensión del progreso del flujo de trabajo.
Desventajas de la Orquestación
- Cuello de Botella: Dado que toda la comunicación debe pasar por el orquestador, este puede convertirse en un cuello de botella, especialmente en escenarios de alto rendimiento.
- Sobrecarga de Rendimiento: La capa adicional de orquestación introduce cierta sobrecarga de rendimiento debido a la comunicación y procesamiento adicionales necesarios. Esto puede impactar la latencia y el rendimiento del sistema.
- Punto Único de Falla: El orquestador es un componente crítico del flujo de trabajo. Si falla, interrumpirá todo el flujo de trabajo, convirtiéndose en un punto único de falla. Sin embargo, puedes abordar esto con estrategias de redundancia, como desplegar múltiples instancias del orquestador y usar balanceo de carga para distribuir la carga.
Conclusiones Clave
- Gestión Centralizada: La orquestación gestiona los flujos de trabajo desde un solo lugar, lo que facilita el manejo de diferentes rutas y errores.
- Resiliencia Mejorada: Los orquestadores pueden reintentar tareas si un servicio falla temporalmente, mejorando la confiabilidad del sistema.
- Visibilidad del Progreso: Los orquestadores mantienen el seguimiento del estado del flujo de trabajo, lo que facilita la comprobación del progreso y la depuración de problemas.
- Escalabilidad Asíncrona: La orquestación asíncrona puede manejar múltiples tareas a la vez sin esperar respuestas, haciendo el sistema más escalable. Las tareas pueden ejecutarse en paralelo, acelerando el proceso general.
- Posible Cuello de Botella: El orquestador puede ralentizar el sistema si se sobrecarga.
- Redundancia Necesaria: Si el orquestador falla, puede detener todo el flujo de trabajo. Es necesaria la redundancia para evitar esto.
En términos simples, la orquestación pone algo a cargo: los Orquestadores, que están al tanto de todo el flujo de trabajo. Si hay algún problema durante el proceso, el Orquestador lo sabrá y tomará medidas para manejarlo o simplemente notificará una falla.
Comentarios