Event sourcing: smetti di perdere la storia, usala
Event sourcing: cos'è (e no, non è solo logging)
Con event sourcing, gli eventi sono la fonte di verità. Non salvi lo "stato finale" di un oggetto, salvi tutto ciò che gli succede. Poi ricostruisci lo stato riproducendo quegli eventi. Sì, come un replay. E no, non sono "solo log": un log racconta, un evento fa fede.
Esempio base: invece di salvare balance = 120, registri MoneyDeposited(200) e poi MoneyWithdrawn(80). Il saldo è un risultato, non un numero magico uscito dal nulla.
Perché dovresti complicarti la vita?
Perché il tuo io futuro ti ringrazierà quando:
- dovrai auditare chi ha fatto cosa, quando e perché,
- vorrai debuggare riproducendo la realtà,
- ti servirà ricostruire un modello dopo cambi di business,
- vorrai proiezioni (read models) senza massacrare il database.
In breve: paghi un po' di complessità ora, per smettere di improvvisare post-mortem dopo.
I mattoni fondamentali (senza fumo)
- Evento: un fatto immutabile, al passato.
OrderPlaced, nonPlaceOrder. - Stream: la sequenza di eventi di un aggregato.
- Aggregato: l'oggetto di dominio che applica gli eventi per ricostruirsi.
- Proiezione: una vista derivata (SQL, Elastic, cache, ecc.) per letture veloci.
Quando usarlo (e quando evitarlo)
Usalo se:
- il tuo dominio cambia spesso,
- la storia è critica,
- hai bisogno di tracciabilità granitica.
Evitalo se:
- il tuo CRUD è basico,
- non ti serve l'audit,
- il team sta ancora scoprendo i repository.
Mini esempio di avvio in Symfony
Facciamo semplice: un aggregato Cart, eventi e un event store in memoria. Niente CQRS completo, niente Kafka, niente magia. Solo il cuore.
1) Definire l'evento
php
2) L'aggregato che riproduce gli eventi
php
3) Un event store minimo (in memoria)
php
4) Uso in un servizio Symfony
php
Ecco. Niente ORM, niente cache, niente parata. Solo l'idea centrale: gli eventi sono la verità, lo stato è una vista calcolata. Poi puoi agganciare proiezioni e listener di Symfony Messenger se vuoi giocare con i grandi.
Da ricordare (se devi spiegarlo)
- Event sourcing salva la storia, non solo il risultato.
- Ricostruisci lo stato riproducendo gli eventi.
- Perfetto per audit e domini che cambiano, inutile per CRUD noioso.
- Symfony non lo fa al posto tuo, ma ti lascia strutturarlo bene.
Se ti sembra pesante, bene: stai scambiando comfort immediato con chiarezza a lungo termine. Paghi ora o paga il tuo io futuro. Scegli tu.