Estoy diseñando un sistema de reservas hoteleras basado en microservicios y he decidido apoyarlo en una arquitectura orientada a eventos (EDA). Lo que busco es que los servicios reaccionen en tiempo real a lo que pasa en el sistema, que escalar y mantener cada pieza sea más sencillo y que integrar servicios nuevos no obligue a tocar los que ya existen.
Esta arquitectura es la base sobre la que voy a construir el resto del sistema.
Qué es la arquitectura orientada a eventos
Es una forma de diseñar software en la que todo gira alrededor de producir y consumir eventos. Un evento es algo que ha ocurrido o un cambio de estado dentro de un microservicio, como “Habitación 101 ha sido reservada” o “Huésped 123 ha hecho check-out”. Los servicios publican esos eventos y se suscriben a los que les interesan, así que se comunican de forma asíncrona y pueden reaccionar en el momento.
Las piezas que necesito
Para montar esto he identificado cuatro componentes.
Eventos de dominio
Los eventos de dominio (Domain Events) representan cambios relevantes dentro del dominio de un microservicio y recogen qué ha pasado exactamente. Con ellos, cada servicio puede reaccionar a un cambio de estado y actualizar su propio estado interno.
Por ejemplo, cuando un huésped hace check-out se dispara un evento “Guest Checkout” con los datos necesarios del proceso: el ID del huésped, el número de habitación y la fecha de salida.
Manejadores de eventos
Los manejadores de eventos (event handlers) son servicios que se suscriben a eventos y ejecutan una acción concreta cuando llegan. Con el evento “Guest Checkout”, un manejador podría actualizar el estado del huésped en la base de datos o enviar un correo de confirmación.
Como manejadores voy a usar Azure Functions, para ganar rendimiento y gastar menos. Con Azure Functions escribo código serverless que se dispara con eventos de distintas fuentes, como Azure Storage Queue, Azure Event Grid o Azure IoT Hub. Eso me permite escalar el procesamiento de eventos según la demanda, pagar solo por el tiempo de cómputo que se consume y dedicarme al código en lugar de a gestionar infraestructura.
Bus de eventos
El bus de eventos es el middleware que reparte los eventos entre servicios. Se encarga de enrutarlos al destino correcto, ofrece colas de mensajes y gestión de errores, y hace de intermediario en la comunicación.
En el sistema de reservas, el bus recibiría el evento “Guest Checkout” y lo enviaría a las Azure Functions que correspondan: gestión de habitaciones, facturación y programa de fidelización. Cada servicio reacciona por su cuenta sin afectar a los demás.
Event Sourcing
Event Sourcing es un patrón que consiste en guardar el historial de eventos de un concepto de dominio. Cuando un huésped hace check-out, se almacenaría el evento “Guest Checkout” con su información (ID del huésped, número de habitación y fecha de salida).
Tener ese historial sirve para auditoría, depuración e informes de negocio. Reconstruyendo la secuencia de eventos se puede analizar cómo se ha comportado el sistema, detectar anomalías o evaluar el impacto de un cambio.
Qué gana el sistema
Con EDA en Azure y Azure Functions como manejadores de eventos, los servicios reaccionan a los cambios al momento y los usuarios reciben respuesta antes. Como cada servicio funciona de forma independiente, el sistema aguanta mejor los picos de tráfico.
Lo que más me interesa es el desacoplamiento: un servicio ya no depende de que otro esté disponible, así que se reduce el riesgo de fallos en cascada y es más fácil mantener o sustituir un servicio concreto. También puedo añadir o quitar servicios sin tocar el resto. Y en costes, con Azure Functions solo pago por el tiempo de cómputo que se usa.
Diagrama
Este diagrama Mermaid muestra cómo fluyen los eventos en el sistema de reservas:
Los eventos salen del Servicio de Reservas hacia los servicios que dependen de él: Gestión de Habitaciones, Facturación y Programa de Fidelización. El Bus de Eventos es el que se encarga de enrutarlos entre servicios.
El participante Azure Functions representa el código serverless que se dispara con esos eventos para hacer tareas concretas, como acciones de gestión de habitaciones, de facturación o actualizaciones del programa de fidelización.
Próximos pasos
Iré contando en el blog cómo avanza el desarrollo y los problemas que me vaya encontrando.
Puedes seguir el proyecto en mi repositorio de GitHub: GitHub repository
Si tú usas otras estrategias para mejorar la arquitectura y el mantenimiento de tus microservicios, me interesa saber cuáles.
Comentarios
Aún no hay comentarios. ¡Sé el primero!
Deja un comentario