Mi rendo conto che la domanda di cui sopra probabilmente solleva un po 'di cosa, ma lascia che provi a spiegare:
Sto provando a racchiudere la mia testa su un paio di concetti correlati, in pratica il modello Saga ( link ) in combinazione con Event-sourcing (A DDD-concept: link )
Un buon post che lo avvolge: link
Sto arrivando alla domanda tra un minuto, ma penso di dover cercare di riassumere quello che ho capito prima (che potrebbe essere sbagliato, quindi per favore correggi se è così) perché questo potrebbe influire sul perché Sto facendo la domanda per cominciare:
- Il modello Saga è una sorta di broker che fornisce un'azione (utente finale, automatizzato, ecc., sostanzialmente qualsiasi cosa che cambierà i dati) divide l'azione in attività commerciali e invia ciascuna di queste attività come messaggi a un Message Bus che a sua volta lo invia alle rispettive radici aggregate di cui occuparsi.
- Queste radici aggregate possono funzionare completamente in modo autonomo (bella separazione di preoccupazioni, grande scalabilità, ecc.)
- Un'istanza di Saga non contiene alcuna logica di business, che è contenuta nelle radici aggregate alle quali invia attività. L'unica 'logica' contenuta nella Saga è la logica del 'processo' (spesso implementata come una Statemachine), che determina in base alle azioni ricevute (oltre agli eventi di follow-up) cosa fare (es .: quali attività inviare)
- I modelli Saga implementano una sorta di modello di transazione distribuita. I.e: quando una delle radici aggregate (che di nuovo funziona in modo autonomo, senza conoscere l'esistenza di ciascuno) non riesce, l'intera azione potrebbe dover essere annullata.
- Questo è implementato avendo tutte le radici aggregate, una volta completato il loro rapporto di attività sulla Saga. (In caso di esito positivo o errore)
- Nel caso in cui tutte le radici aggregate restituiscano un successo, lo statemachine interno se la Saga determina cosa fare dopo (o decide che è fatto)
- In caso di errore, la Saga emette su tutte le root aggregate che hanno preso parte all'ultima azione una cosiddetta Compensation Action, cioè un'azione per annullare l'ultima azione eseguita da ciascuna delle radici aggregate.
- Questo potrebbe semplicemente fare un "voto meno 1" se l'azione fosse "più 1 voto", ma potrebbe essere più complicato come ripristinare un blogpost alla sua versione precedente.
- Event-sourcing (vedi il blogpost che combina i due) mira a esternalizzare il salvataggio dei risultati di ciascuna delle attività che ciascuna delle radici aggregate intraprende in un archivio eventi centralizzato (i cambiamenti sono chiamati 'eventi' in questo contesto)
- Questo archivio eventi è la "versione singola della verità" e può essere utilizzato per riprodurre lo stato di tutte le entità semplicemente iterando gli eventi archiviati (essenzialmente come un registro eventi)
- Combinare i due (cioè: lasciare che le radici di aggregazione utilizzino Event-sourcing per esternalizzare il salvataggio delle modifiche prima di riferire alla Saga) offre molte buone possibilità, una delle quali riguarda la mia domanda ...
Ho sentito il bisogno di togliermelo dalla spalla, dal momento che è molto da capire in una volta. Dato questo contesto / mindset (di nuovo, si prega di correggere se sbagliato)
la domanda: quando una radice aggregata riceve un'azione compensativa e se tale radice aggregata ha esternalizzato le sue modifiche di stato utilizzando il sourcing di eventi, l'azione compensa in tutte le situazioni non sarebbe una cancellazione dell'ultimo evento nell'Event Store per quella determinata radice aggregata? (Supponendo che l'implementazione persiste consenta le eliminazioni)
Questo avrebbe molto senso per me (e sarebbe un altro grande vantaggio di questa combinazione), ma come ho detto potrei fare queste ipotesi sulla base di una comprensione errata / incompleta di questi concetti.
Spero che questo non sia stato troppo prolisso.
Grazie.