What is an example of event sourcing?

Event Sourcing: Un Patrón DDD para la Persistencia de Eventos

hace 12 años

Valoración: 3.89 (3254 votos)

En el mundo del Diseño Dirigido por Dominios (DDD), los eventos de dominio juegan un papel crucial. Antes de sumergirnos en Event Sourcing, es fundamental entender qué son y cómo se diferencian de otros tipos de eventos en el desarrollo de software. Los eventos de dominio representan hechos inmutables que ocurren como resultado del comportamiento de un agregado. En un modelo de dominio bien diseñado, los agregados deberían encapsular la lógica de negocio y actuar como fábricas para estos eventos. La comunicación clara y precisa, utilizando el lenguaje ubicuo, es esencial para definir y nombrar estos eventos de manera significativa dentro del contexto del dominio.

Is Kafka an event source?
Kafka is a perfect technology for event sourcing. Here's why: Distributed, durable, and scalable event log: Kafka's distributed architecture provides a highly scalable, fault-tolerant, and performant event log for storing and processing events.
Índice de Contenido

Eventos de Dominio vs. Eventos de Integración

Es importante distinguir entre eventos de dominio y eventos de integración. Aunque ambos comparten similitudes, su alcance y propósito son distintos. Los eventos de dominio se utilizan para notificar cambios de estado dentro del mismo contexto delimitado. Pueden desencadenar efectos secundarios en otros agregados dentro del mismo contexto, a menudo mediante transacciones síncronas en memoria. Por otro lado, los eventos de integración se utilizan para comunicar cambios de estado entre diferentes contextos delimitados o incluso sistemas externos. Estos eventos requieren operaciones asíncronas debido a que cruzan límites de contexto y el tiempo de respuesta no es determinista. Para la transmisión de eventos de integración, se suelen utilizar tecnologías como Message Brokers o Event Buses, siendo Kafka y RabbitMQ opciones populares y eficientes.

¿Qué es Event Sourcing? La Persistencia Basada en Eventos

Event Sourcing es un patrón arquitectónico que propone un cambio de paradigma en la forma en que persistimos los datos. En lugar de almacenar el estado actual de una entidad, Event Sourcing se centra en registrar la secuencia cronológica de eventos que han modificado ese estado. Imagina un registro detallado de cada acción que ocurre en tu sistema, guardado de forma inmutable y secuencial. Greg Young es reconocido por formalizar y popularizar Event Sourcing en la forma en que lo conocemos hoy en día.

La clave de Event Sourcing reside en el uso de un almacenamiento especializado llamado event store. Este almacén está diseñado para persistir los eventos de dominio en el orden exacto en que ocurrieron, convirtiéndolos en la fuente de verdad única y confiable. La inmutabilidad es una característica fundamental del event store: los eventos se añaden (append) pero nunca se modifican ni se eliminan.

Con Event Sourcing, abandonamos el enfoque tradicional de recuperar directamente el último estado de un objeto de dominio. En su lugar, leemos la secuencia de eventos almacenados y rehidratamos el objeto, aplicando cada evento en orden cronológico hasta alcanzar su estado actual. Este proceso de reconstrucción del estado a partir de la secuencia de eventos ofrece una serie de ventajas significativas.

Ventajas Clave de Event Sourcing

  • Eliminación de la Impedancia Objeto-Relacional: Almacenar eventos serializados elimina la complejidad del mapeo objeto-relacional (ORM). Los eventos se persisten tal como son, sin necesidad de transformarlos para ajustarlos a un esquema de base de datos relacional.
  • Registro de Auditoría Intuitivo y Completo: La secuencia de eventos en sí misma constituye un registro de auditoría natural y detallado. Se puede rastrear la historia completa de un objeto, desde su creación hasta su estado actual, facilitando la depuración, el análisis y el cumplimiento normativo.
  • Escalabilidad y Rendimiento Mejorados: La escritura de eventos y la lectura para reconstruir el estado son operaciones separadas que pueden escalar de forma independiente. Esta separación es uno de los motivos por los que Event Sourcing se combina tan bien con CQRS (Command Query Responsibility Segregation).

Desafíos y Consideraciones de Event Sourcing

Si bien Event Sourcing ofrece numerosas ventajas, también presenta desafíos que deben considerarse cuidadosamente. La curva de aprendizaje puede ser pronunciada, especialmente en la implementación inicial. Es crucial abordar aspectos como el manejo de la concurrencia, donde múltiples usuarios pueden intentar modificar el mismo agregado simultáneamente. Se necesitan mecanismos para asegurar que los eventos se procesen en el orden correcto y se eviten conflictos.

La elección de la tecnología para implementar Event Sourcing también es importante. Existen soluciones especializadas como Event Store, pero también se pueden utilizar bases de datos documentales como Postgres, junto con bibliotecas como MartenDB, que facilitan la implementación de Event Sourcing.

CQRS: El Complemento Perfecto para Event Sourcing

El patrón arquitectónico CQRS (Command Query Responsibility Segregation), o Segregación de Responsabilidad de Comandos y Consultas, encaja de manera natural con Event Sourcing. CQRS se basa en la idea de separar las operaciones de escritura (comandos) de las operaciones de lectura (consultas).

En un sistema basado en Event Sourcing y CQRS, los comandos representan las intenciones del usuario y las acciones que desea realizar. Estos comandos son los que desencadenan cambios de estado en los agregados y, como resultado, la generación de eventos de dominio. Del lado de la escritura, los comandos se procesan, validan las reglas de negocio del dominio y, si son válidos, generan eventos que se almacenan en el event store.

Por otro lado, las consultas se utilizan para leer datos. En lugar de consultar directamente el event store, que está optimizado para la escritura secuencial, se utilizan vistas materializadas. Estas vistas son representaciones pre-calculadas de los datos, construidas a partir de los eventos almacenados. Las vistas materializadas están optimizadas para las consultas, permitiendo lecturas rápidas y eficientes.

Ejemplo Práctico: El Agregado Cliente

Consideremos un ejemplo sencillo con un agregado Cliente. Cuando se recibe un comando para actualizar la información de un cliente, en lugar de modificar directamente los campos del cliente en una base de datos tradicional, se crea un evento de dominio, por ejemplo, ClienteActualizado. Este evento contiene la información actualizada (payload) y se añade a la secuencia de eventos del cliente en el event store.

En el código, este proceso podría verse así:

AppendEvent ( @evento ); Aplicar ( @evento );

El método AppendEvent, definido en una clase base AggregateRoot, añade el evento a una cola de eventos no confirmados (uncommitted events) dentro del agregado. Posteriormente, el método Aplicar (Apply) muta el estado del agregado en función del evento. Cada tipo de evento aplicado modifica la parte correspondiente del estado del agregado. Por ejemplo, un evento ClienteCreado inicializaría los datos básicos del cliente, mientras que un evento DireccionClienteActualizada modificaría únicamente la información de la dirección.

Consideraciones Finales y Próximos Pasos

Hasta ahora, hemos explorado los fundamentos de Event Sourcing y su relación con CQRS, centrándonos en la persistencia de eventos en memoria. Sin embargo, para implementar Event Sourcing de forma efectiva, es crucial persistir estos eventos en una base de datos de escritura dedicada y proyectarlos a bases de datos de lectura para las consultas. Esta técnica, conocida como Proyecciones (Projections), será el tema del próximo artículo. Mantente atento para descubrir cómo llevar Event Sourcing al siguiente nivel y construir sistemas robustos, escalables y auditables.

Subir