Attualmente sto imparando su Event Sourcing tramite il libro Microsoft .NET - Architecting Applications for the Enterprise . L'individuazione degli eventi è, secondo le mie parole, un modello architettonico di memorizzazione di "eventi" anziché di "entità attuali". Le entità attuali possono essere create eseguendo il ciclo sugli eventi che appartengono ad esso.
Il problema delle prestazioni di creazione di entità attuali può essere mitigato creando una memoria aggiuntiva in cui periodicamente le entità correnti sono "istantanee" (create dall'istantanea precedente e dagli eventi successivi).
Nel libro l'architettura che appartiene a Event Source è configurata come segue:
Qui tutti gli eventi (correlati a una partita di pallanuoto) sono memorizzati in un negozio RavenDB NoSQL. Vediamo anche un autobus per tenere traccia degli eventi e di una saga che appartiene a gruppi di eventi.
Ho alcune domande su Event Sourcing (ho deciso di chiedere a tutti in una volta poiché tutte le domande riguardano la descrizione nel libro):
- Mi chiedo in che modo questi eventi verranno archiviati. Posso immaginare che i dati degli eventi possono cambiare nel tempo (proprietà extra, nuovi nomi di eventi) e che gli eventi devono essere facilmente correlati tra loro e se stessi. In che modo l'attuale struttura del database e il codice di accesso ai dati sembrano facilitare il cambiamento e il recupero dei dati?
- Cos'è una saga? Perché si chiama una saga? Sono persistenti e se sì, come?
- Come funziona un autobus? Quali sono i vantaggi rispetto alla semplice scrittura di eventi direttamente in un negozio di eventi?
- Nell'architettura di cui sopra in cui i comandi e le query sono separati (CQRS) e i comandi sono implementati utilizzando Event Sourcing mentre le query vengono lette dall'istantanea, cosa succede quando i dati devono essere visualizzati durante l'avvio di un comando? (Ad esempio, mostrare i dati del conto bancario mentre un utente desidera effettuare un deposito, sulla base di questi dati.) Come, in pratica, ci assicuriamo che i dati visualizzati siano aggiornati?