Event Sourcing in pratica: non solo versioning dei dati, ma un potente strumento di analytics
Oggi voglio discutere un pattern architetturale comune nelle applicazioni business complesse ma spesso sottovalutato: l'«Event-Sourced Entity» o, più semplicemente, un robusto sistema di versioning dei dati.
Cos'è?
Nel classico modello CRUD, aggiorniamo un record direttamente in una tabella come products: price = 1000. La cronologia delle modifiche viene silenziosamente persa.
Il modello event-driven funziona diversamente:
- L'entità principale memorizza solo lo stato attuale (ad esempio, l'ultimo prezzo, il livello delle scorte).
- Ogni cambiamento (un evento) viene registrato in una tabella di log separata come voce indipendente e immutabile.
- Lo stato attuale è il risultato dell'applicazione sequenziale di tutti gli eventi storici.
Un semplice esempio in Laravel
Consideriamo un'entità ProductPricing.
1. Migrazioni:
2. Modello ed evento:
Vantaggi di questo approccio:
✅ Audit trail completo e tracciabilità. Sappiamo non solo cosa è cambiato, ma anche quando, da chi e perché. Inestimabile per la conformità e la risoluzione delle controversie.
✅ Ricostruzione dello stato a un momento specifico. Possiamo "riprodurre" il modello fino a qualsiasi momento passato ricalcolando gli eventi fino a quel punto.
✅ Logica di business disaccoppiata. Gli eventi sono fatti puri. Possono essere elaborati in modo asincrono, inviati a code di messaggi (RabbitMQ, Kafka).
✅ Fondamento per CQRS. Il registro degli eventi è una perfetta fonte unica di verità per costruire vari modelli di lettura (ad esempio, specializzati per il reporting).
Svantaggi e complessità:
❌ Complessità aumentata. L'architettura diventa più complessa del "semplice CRUD". La coerenza tra la tabella principale e gli eventi deve essere gestita.
❌ Overhead delle prestazioni. Invece di un singolo aggiornamento, eseguiamo almeno due scritture. Eccessivo per sistemi ad alto throughput dove la cronologia non è necessaria.
❌ Interrogazione della cronologia. L'analisi dei dati richiede di lavorare con grandi flussi di eventi, il che può essere non banale.
Dove è particolarmente utile? Il caso d'uso chiave: l'analytics.
Questo approccio è una miniera d'oro per gli analisti di dati e la business intelligence. Perché?
- Analisi dei trend e delle dinamiche: Costruisci facilmente grafici dei cambiamenti di prezzo dei prodotti nel tempo, analizza la stagionalità e correla con le campagne marketing.
- Calcolo delle metriche: Prezzo medio su un periodo, tasso di rotazione delle scorte, frequenza delle modifiche.
- Analisi delle cause profonde: Raggruppare gli eventi per motivo o user_id rivela cosa guida più spesso i cambiamenti: fluttuazioni valutarie, azioni dei concorrenti, domanda stagionale.
- Modellazione "What-If": Sulla base di eventi storici, puoi costruire simulazioni. "Cosa succede al profitto se aumentiamo il prezzo del X% durante il periodo Y?"
Esempio di query SQL per l'analytics:
Conclusione
Il pattern "Event-Sourced Entity" è più di un semplice "salvare il vecchio valore". È un cambiamento di paradigma dal pensare in "stati" al pensare in "processi" e "cronologia".
Usalo quando:
- Sono richiesti audit trail legislativi (farmaceutica, finanza, B2G).
- Il processo di business è una sequenza di eventi significativi (ordine: creato → pagato → evaso → spedito).
- Hai un bisogno critico di analytics approfondite su metriche chiave che cambiano (prezzi, scorte, tassi, valutazioni).
È un investimento nell'architettura che ripaga con trasparenza, flessibilità e profondità dei dati per il processo decisionale.