Un Modelo de EDA: Event Driven Architectures
Published: 2023-04-22 09:04:54

Personalmente tuve la fortuna de estar presente en el último evento de AWS re:invent 2022, y una de las cosas que más me gustó fué la [Keynote del Dr. Werner Vogels](https://www.youtube.com/watch?v=RfvL_423a-I). Es cierto que este es uno de los momentos más esperados del evento, y uno de los favoritos de muchos... entre los que me incluyo...

## The World is Asynchronous

Pero la particularidad de esta **Keynote**, para mí, es que en un tiempo en que se resaltan los diferentes avances de la _Inteligencia Artificial_, o las _Economías Desentralizadas_ con la Blockchain... El mensaje del Dr. Vogel en su Keynote fué como _"volver a las bases"_ e inaugurar un nuevo tiempo, o un nuevo ciclo: **en pleno 2022**, afirmando que "_The World is Asynchronous_" y marcando el resurgimiento de las EDA: las **Event-Driven Architectures**

![AWS re:Invent 2022 - Keynote with Dr. Werner Vogels]
(https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9im5rnyrsbl4u9yet2xw.png)

Y cuando pensamos en el _"Asincronismo"_ y las _"Arquitecturas Orientadas a Eventos"_ no solamente visualizamos a los a los _microservicios_ y sus _orquestaciones_, o a las _SOA_, sino que fácilmente podemos seguir retrocediendo a más de 20 años atrás cuando en los líbros de _Arquitectura de Software_ nos presentaban a patrones para desacoplar como el de _"Publicación/Subscripción"_

## Patrones de Comunicación en nuestro mundo

A veces me gusta pensar en nuestro patrón de comunicación como personas, que, cuando hablamos, además de comunicarnos con la persona a la que nos estamos dirigiendo, también están todos los que nos escuchan. Y que depende de cada persona capaz de recibir al mensaje, el "prestar atención" o "suscribirse", incluso alguien que podríamos no querer que participe de la comunicación...

Ese modelo de comunicación de "publisher and subscriber", como refuerza Werner Vogels, es el predominante en nuestro mundo asyncrónico...

## Dilemas de Comunicación en el mundo de EDA

Pero _¿Cómo implementar la comunicación en un EDA?_

Es decir, ¿Que decisiones de diseño debemos tomar?. A la hora de publicar un evento, ¿En dónde lo publico?¿En ún único Event-Bus para todo el sistema al que todos están suscriptos?¿O en diferentes Event-Bus con alguna identidad funcional o técnica que solamente algunos servicios se suscriben?¿Cómo se define el límite de cada identidad funcional?, que seguramente, a medida que el sistema crezca se puede ir tornando más difuso..

Y la siguiente pregunta derivada, sería: _¿Que reglas debería establecer para gobernar a ese modelo de comunicación asyncrónica?_ Y ahí podemos estar en el dilema de elegir entre dos grandes aproximaciones para la comunicación entre (micro)servicios: la **Orquestación** y la **Coreografía** que vamos a repasar a continuación:

## Orquestación vs Coreografía

Supongamos que en nuestro sistema cada (micro)servicio tiene su propia base datos y necesitamos un mecanismo para lograr la consistenacia entre las distintas báses de datos cuando en el sistema se realiza una transacción, que por definición, debe verse reflejada de forma completa en todos los (micro)servicios, o en su defecto, se cancelada o revierte para evitar problemas de inconsitencia.

![orquestación vs coreografía](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfjgb6pdphsv34nja687.png)

En la aproximación de "**orquestación**" hay un servicio dedicado, _como un director de orquesta_, que dirige cómo debería cada servicio actualizar su estado.

En la aproximación de "**coreografía**", no existe la figura de un director, _pero todos los servicios conocen cómo_ deben _actualizar _a su estado interno al recibir el evento, de, por ejemplo, la ejecución de una transacción.

Dicho sea de paso, estas son dos posibles aproximaciones del **patrón SAGA** para micro servicios, y están muy bien explicados en el sitio de [_"Microservice Architecture"_ de Chris Richardson](https://microservices.io/patterns/data/saga.html)

## ¿Cómo implementar un EDA?

Y en este punto, me gustaría compartir mi experiencia en la implementación de un EDA en un entorno académico, con la consigna de coordinar la integración de ocho módulos autónomos con su propio medio de persistencia.

A simple vista, un diagrama similar al siguiente:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4r7msh34lqbl64a509m8.png)

Y se aplicaron las siguientes decisiones de diseño:

- **Primero**, la comunicación se realizó a través de un componente centralizado "EDA" que implementaba el patrón de "Publisher and Subscriber"

- **Segundo**, para la lógica de negocio que implicaba transaccionalidad entre distintos módulos, se seleccionó una estrategia "_coreográfica_": es decir, la lógica de coordinación para ejecutar una transacción no está centralizada en un componente _director_, sino que cada interviniente de la transacción conoce de qué manera deber actualizar a su estado interno ante la llegada del evento de la transacción.

- En este punto, entedimos que se **reducía el acoplamiento** al no depender de un componente centralizado y que se fortalezca la independencia entre los módulos al actuar siguiendo la filosofía de coreografía.

- También, en este punto, entendimos que el sistema **escalaba mejor**, porque en el caso que un nuevo módulo se incorpore al sistema, podría integrarse sin afectar a los demás e implementando su lógica de comportamiento en la coreografía, al estar cada componente actual y nuevo **debilmente acoplado** al sistema.


- **Tercero**, la publicación de mensajes: para reducir al acoplamiento aún mas entre los módulos, se mantuvo la decision que **cada cómponente publique sus mensajes y eventos en un tópico propio**. Es decir, lo que un componente tiene que notificar hacia el resto de los sistemas, lo deja publicado en su propio tópico y no es su responsabilidad enviarle ese mensaje a otro módulo que esté interesado o necesitando recibirlo. Es responsabilidad del módulo que necesita a los mensajes suscribirse a los tópicos de cada uno de los emisores con los que necesita interactuar. 
**La responsabilidad de un emisor**, por ejemplo, la aplicación call-center, es solo de publicar sus mensajes en él topico que lleva su nombre "call-center". Luego, el módulo que necesite, por ejemplo, reportar un ticket, o conocer su resolución, será el que se suscriba al tópio "call-center"

- Esa decición reduce el acoplamiento, y permite que si, por ejemplo, se incorpora un nuevo módulo de _analítica de reclamos_ simplemente se incorpora como nuevo módulo al sistema y se suscribe al tópico de "call-center" para hacer su lógica y generar sus resultados. Y el resto de los módulos no se vieron afectados por su incorporación.

En esta aproximación, con estos tres pilares para organizar la comunicación entre los servicios de una arquitectura orientada a eventos, con decisiones de integración de componentes que favorecen el desacoplamiento (ej, elegir coreografía como medio de transaccionalidad entre servicios, y publicar los mensajes en solo el canal del propio módulo) llevó el proyecto a feliz término y permitió la integración del ecósitema de los módulos demostrando que las decisiones de diseño que se tomaron hacen posible la implamentación de una EDA sin incrementar la complejidad en la forma de comunicación de los servicios que integra.

Bueno, espero que nuestra experiencia a través de un ejercicio académico de integración en un arquitectura orientada a eventos, puede ser como referencia para identificar a un camino exitos, aunque segurametne existen otras alternativas de hacer las cosas de forma más eficiente.

Muchos éxitos!
Pablo




## Referencias

- [AWS re:Invent 2022 - Keynote with Dr. Werner Vogels](https://www.youtube.com/watch?v=RfvL_423a-I)
- [Imagen Orquesta pixabay CC0](https://pixabay.com/photos/conductor-andrea-vitello-concert-5157153/)
- [Imagen Ballet Teatro Imperial pixabay CC0](https://pixabay.com/photos/ballet-theater-play-imperial-1175122/)
- [Microservices Patterns - SAGA](https://microservices.io/patterns/data/saga.html)
- [Pattern-Oriented Software Architecture Volume 1: A System of Patterns](https://www.amazon.com/-/es/Frank-Buschmann/dp/0471958697)
- [Universidad UADE - FAIN](https://www.uade.edu.ar/facultad-de-ingenieria-y-ciencias-exactas/)