Event Sourcing es un patrón de diseño que tiene como objetivo capturar todos los cambios que ocurren dentro de una aplicación y almacenarlo como una secuencia de eventos.
Dejame simplificarlo, lo que hace Event Sourcing es almacenar en una base de datos todos los cambios ocurridos sobre una entidad de tu aplicación, por ejemplo, imaginemos que tienes una entidad Producto, entonces lo que hará Event Sourcing es almacenar en una tabla o store todos los eventos que ocurrieron en el ciclo de vida de este record producto, como cuales?
Por ejemplo, eventos como:
Creación del Producto: CreateProductEvent
Actualización del nombre del Producto: UpdateNameProductoEvent
Sube precio del producto: UpdatePrecioProductEvent
Lanzar promoción del producto: AddPromotionProductEvent
Eliminar producto: DeleteProductEvent
Como puedes ver cada cambio en la entidad Producto deberá ser almacenada en la base de datos, y por supuesto con el respectivo payload o información necesaria para realizar la tarea correspondiente, si por ejemplo quieres enviar un evento SUBE PRECIO del producto, entonces en el payload del evento deberías agregar : { Precio : 1000 }
Donde almacenar todos estos Eventos?
En la arquitectura de Event Sourcing existe una base de datos que llamaremos EventStore, este EventStore puede ser implementado en diversos motores de bases de datos tanto relacionales como document.
Si escoges usar un tipo document: puedes usar MongoDB, Cosmos, EventStoreDB
Si escoges una relacional: Una gran alternativa es Postgres usando Martens como interfaz.
¿Cómo almacenar los Eventos?
La tabla o documento que uses para almacenar la lista de eventos puede variar dependiendo de la lógica de negocios, pero debes de tener en cuenta que esta estructura debe ser lo más genérica posible para que pueda soportar almacenar eventos de todas las entidades de negocio de tu aplicación, no solo de productos entity.
Usualmente la tabla/document debe tener esta estructura:
DocumentId
NombreEvento
Payload
FechaCreacion
AgregationId
Como funciona Event Sourcing?
Si lo notas en la estructura del documento/tabla que almacenará los eventos en posición 5 puse al AgregationId, y esto es clave para el funcionamiento de Event Sourcing.
Porque si estamos hablando de que absolutamente todo en Event Sourcing se basará en eventos, entonces debería existir un agente, un componente que se encargue de organizar estos eventos.
Justamente es lo que piensas, el componente Aggregate es el encargado de estandarizar la lista de eventos y agruparlos en una colección determinada.
Por ejemplo puedes crear un Aggregate encargado de los eventos producidos en Productos, entonces este se llamaría : AggregateProducto
Otro tema fundamental en Event Sourcing es el orden, la secuencia en que se almacenan los eventos dentro de un Agregate, por este motivo también agregamos en su estructura un campo/property “FechaCreacion”, la secuencia se dará en función a este valor.
Teniendo en cuenta esto, si deseas consultar en tiempo real el último estado de tu entidad Producto, entonces debes de llamar al último Evento almacenado en tu base de datos EventStore.
Puedo Editar o Eliminar algún Evento?
Se que una pregunta no se debe responder jamás con otra pregunta, pero vamos a tomar una licencia, dejame preguntarte, si terminaste la relación amorosa con tu novia, puedes deshacer ese evento que ocurrió?
Claro puedes decirme, pero después volvimos!
Aja, pero aun así el evento de terminación ocurrió, y eso nadie lo puede deshacer.
En otras palabras, no puedes deshacer o cambiar el pasado!
Lo mismo ocurre en Event Sourcing, no puedes editar ni cambiar jamás ningún tipo de evento, solo puedes crear nuevos eventos.
Por cierto, si terminaste con tu novia, no te recomiendo volver, lo que sigue no es bueno.
Conclusiones del Event Store
Ya que comprendiste la idea principal de Event Sourcing en el Store, dejame simplificarlo con las palabras técnicas:
Stream: Cuando escuches Stream, no te asustes, solo se refiere a una collection de eventos
Projection: Es un sinónimo de Agreggation, algunos arquitectos prefieren llamar de esta forma a la colección de eventos agrupados en función a una entidad.
EventStore: Es el nombre que recibe la base de datos que almacenará la lista de Eventos con su respectivo Agregation, no debes confundirlo con el EventStoreDB, este es solo un producto de base de datos de tipo document similar a mongodb.
En si como EventStore puedes usar Postgres con Martens, MongoDB, Cosmos, etc.
Lo ideal es que el proceso de registro de eventos sea rápido, ligero y escalable por la gran cantidad de eventos que puede procesar tu sistema.
¿Qué te pareció, te interesa Event Sourcing? Entonces imagina implementarlo con Event Driven Architecture!
Puedes visitar mi curso, donde implementamos todo un proyecto .NET utilizando estas técnicas desde básico a un nivel avanzado: