Event sourcing: deja de perder el historial y úsalo
Event sourcing: qué es (y no, no es solo logging)
Con event sourcing, los eventos son la fuente de verdad. No guardas el "estado final" de un objeto, guardas todo lo que le pasa. Luego reconstruyes el estado reproduciendo esos eventos. Sí, como un replay. Y no, no es "solo logs": un log cuenta, un evento es la verdad.
Ejemplo básico: en vez de guardar balance = 120, registras MoneyDeposited(200) y luego MoneyWithdrawn(80). El saldo es un resultado, no un número mágico salido de la nada.
¿Por qué te complicas la vida?
Porque tu yo del futuro te lo agradecerá cuando:
- tengas que auditar quién hizo qué, cuándo y por qué,
- quieras debuggear reproduciendo la realidad,
- necesites reconstruir un modelo tras cambios de negocio,
- quieras proyecciones (read models) sin destrozar tu base.
En resumen: pagas un poco de complejidad ahora, para dejar de improvisar autopsias después.
Las piezas clave (sin humo)
- Evento: un hecho inmutable, en pasado.
OrderPlaced, noPlaceOrder. - Stream: la secuencia de eventos de un agregado.
- Agregado: el objeto de dominio que aplica eventos para reconstruirse.
- Proyección: una vista derivada (SQL, Elastic, caché, etc.) para leer rápido.
Cuándo usarlo (y cuándo evitarlo)
Úsalo si:
- tu dominio cambia a menudo,
- el historial es crítico,
- necesitas trazabilidad de acero.
Evítalo si:
- tu CRUD es básico,
- no necesitas auditoría,
- tu equipo todavía descubre los repositorios.
Mini ejemplo de iniciación en Symfony
Vamos al grano: un agregado Cart, eventos y un event store en memoria. Nada de CQRS completo, nada de Kafka, nada de magia. Solo el núcleo.
1) Definir el evento
php
2) El agregado que reproduce eventos
php
3) Un event store mínimo (en memoria)
php
4) Uso en un servicio Symfony
php
Listo. Ni ORM, ni caché, ni desfile. Solo la idea central: los eventos son la verdad, el estado es una vista calculada. Luego puedes enchufar proyecciones y listeners de Symfony Messenger si quieres jugar con los mayores.
Para llevar (por si tienes que explicarlo)
- Event sourcing guarda historia, no solo el resultado.
- Reconstruyes el estado reproduciendo eventos.
- Es genial para auditoría y dominios que cambian, inútil para CRUD aburrido.
- Symfony no lo hace por ti, pero te deja estructurarlo limpio.
Si te parece pesado, bien: estás cambiando comodidad inmediata por claridad a largo plazo. Pagas el coste ahora o lo paga tu yo del futuro. Tú decides.