Event sourcing e CQRS sono ottimi perché gli sviluppatori si bloccano con un database pre-modellato con cui lo sviluppatore deve lavorare per tutta la vita dell'applicazione, a meno che non ci sia un progetto di migrazione di grandi quantità di dati. CQRS e ES hanno anche altri vantaggi come scalare eventstore, log di controllo ecc. Che sono già presenti su Internet.Quali sono gli svantaggi dell'utilizzo di Event sourcing e CQRS?
Ma quali sono gli svantaggi?
Qui ci sono alcuni svantaggi che mi viene in mente dopo la ricerca e la scrittura piccola demo apps
- Complex: Alcune persone dicono ES è complessa. Ma direi che avere un'applicazione complessa è meglio di un modello di database complesso su cui è possibile eseguire query molto ristrette utilizzando un linguaggio di query (più join, indici ecc.). Voglio dire che alcuni linguaggi di programmazione come Scala hanno una libreria di raccolta molto ricca che è molto flessibile per produrre alcune aggregazioni seriamente complesse e inoltre c'è Apache Spark che rende facile la raccolta di query distribuite. Ma i database saranno sempre limitati alle sue capacità di linguaggio di query e la distribuzione dei database è più difficile del codice applicativo distribuito (Basta distribuire un'altra istanza su un'altra macchina!).
- Utilizzo spazio su disco elevato: l'archivio eventi potrebbe finire con l'utilizzo di molto spazio su disco per memorizzare eventi. Ma possiamo pianificare una pulizia ogni poche settimane e creare uno snapshot e potrebbe essere possibile archiviare eventi storici localmente su un HD esterno, nel caso in cui avessimo bisogno di vecchi eventi in futuro?
- Utilizzo memoria alta: lo stato di ogni oggetto dominio è archiviato in memoria, il che potrebbe aumentare l'utilizzo della RAM e la memoria RAM è costosa. GRANDE PROBLEMA !! perché sono povero! qualche soluzione a questo? Si può usare Sqlite invece di memorizzare lo stato in memoria? Sto rendendo le cose più complesse introducendo più istanze di Sqlite nella mia applicazione?
- Tempo di avvio più lungo: in caso di errore o di aggiornamento del software l'avvio è lento a seconda del numero di eventi. Ma possiamo usare le istantanee per risolvere questo?
- Consistenza finale: Problema per alcune applicazioni. Immagina se Facebook utilizzasse Event source con CQRS per archiviare i post e considerando quanto sia affollato il sistema di Facebook e se ho postato un post vedrei il mio post fb il giorno successivo :)
- Eventi serializzati nel negozio Eventi: Eventi store eventi del negozio come oggetti serializzati, il che significa che non possiamo interrogare il contenuto degli eventi nell'archivio eventi che è comunque scoraggiato. E non saremo in grado di aggiungere un altro attributo all'evento in futuro. La soluzione sarebbe di memorizzare eventi come oggetti JSON invece di eventi serializzati? Ma è una buona idea? Oppure aggiungi altri eventi per supportare la modifica dell'oggetto evento originale?
Qualcuno può commentare gli svantaggi che ho portato qui e correggermi se ho torto e suggerire un altro che potrebbe essermi perso?
Perché lo stato di ogni oggetto dominio è memorizzato? gli oggetti del dominio vengono ricreati dagli eventi quando sono necessari. Perché dovresti pensare che FB non userebbe l'event sourcing, solo perché sono occupati?La mia comprensione è che usano un singolo master di scrittura e diversi read slave che sincronizzano "alla fine", quindi usano la coerenza finale, che è il motivo per cui a volte puoi pubblicare qualcosa e poi non vederlo nel tuo feed. –
Ha senso! Ma la ragione per cui ho pensato che lo stato dell'oggetto dominio sarà memorizzato in memoria perché sono costosi da ricreare. Spingi davvero migliaia di eventi per oggetto dominio ogni volta che c'è un aggiornamento per 1 attributo di tale oggetto dominio? e immagino di aver sbagliato su FB non usando l'event sourcing. Grazie :) – hajime
di solito non avresti migliaia di eventi per oggetto, ma se lo facessi potresti non essere lento come pensi (selezione semplice senza join per ottenere gli eventi) e poi applicato in memoria. È sempre possibile "snapshot" degli eventi per un oggetto se questo è effettivamente dimostrato essere un problema durante il perf testing. –