Blog

Arquitectura orientada a eventos con Azure Functions

EDA
Microservices
Real-Time Systems
C#
.NET
Azure Functions
Serverless

Cómo planteo la arquitectura orientada a eventos de un sistema de reservas hoteleras en Azure: eventos de dominio, bus de eventos y Azure Functions.

Arquitectura orientada a eventos con Azure Functions

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:

sequenceDiagram participant R as Servicio de Reservas participant B as Bus de Eventos participant H as Gestión de Habitaciones participant F as Facturación participant L as Fidelización participant AF as Azure Functions R->>B: Publica Guest Checkout B->>H: Enruta Guest Checkout H->>R: Habitación pasa a vacante R->>B: Publica estado de habitación B->>F: Enruta estado de habitación F->>R: Notificación de factura R->>B: Publica factura procesada B->>L: Enruta factura procesada L->>R: Suma o resta puntos R->>B: Publica puntos actualizados B->>AF: Dispara acciones (ej. avisar a limpieza) AF->>H: Acciones de habitaciones AF->>F: Acciones de facturación AF->>L: Actualiza puntos

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

Tu nombre y tu comentario se publicarán cuando los apruebe. Más información en la política de privacidad.