Event Sourcing

Persiste el estado como una secuencia inmutable de eventos en lugar del estado actual.

Contexto

Auditoría completa, replay de bugs en producción, modelos de lectura derivados, sistemas regulados (banca).

Problema

Guardar solo el estado actual pierde el por qué del cambio.

Solución

Cada cambio es un evento (OrderPlaced, OrderPaid). El estado se reconstruye plegando los eventos.

#Ejemplo en C#

public abstract record DomainEvent(DateTime At);
public record OrderPlaced(Guid Id, decimal Total, DateTime At) : DomainEvent(At);
public record OrderPaid(Guid Id, DateTime At) : DomainEvent(At);

public class Order
{
    public Guid Id { get; private set; }
    public decimal Total { get; private set; }
    public bool Paid { get; private set; }

    public static Order Replay(IEnumerable<DomainEvent> events)
    {
        var order = new Order();
        foreach (var e in events) order.Apply(e);
        return order;
    }

    private void Apply(DomainEvent e)
    {
        switch (e)
        {
            case OrderPlaced p: Id = p.Id; Total = p.Total; break;
            case OrderPaid:     Paid = true; break;
        }
    }
}
Cuándo NO aplicarlo
  • Si no necesitas auditoría profunda ni replay: añade complejidad enorme.
  • Si la migración de esquemas de eventos no se planifica: te ahogas.
Tradeoffs
Pro Contra
Auditoría perfecta + replay Migración de eventos versionados es difícil
Encaja con CQRS y proyecciones Snapshots necesarios para entidades con muchos eventos

#extra #events #audit