Mi rendo conto che la domanda di cui sopra probabilmente solleva alcuni "what ??", ma lasciami provare a spiegare:
Sto cercando di avvolgere la mia testa su un paio di concetti correlati, fondamentalmente il modello Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) in combinazione con Event-sourcing (un concetto DDD : http://en.wikipedia.org/wiki/Domain-driven_design )
Un buon post che lo mette insieme: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
Sto arrivando alla domanda tra un minuto, ma penso che dovrei provare a riassumere prima quello che ho capito (che potrebbe benissimo essere sbagliato, quindi per favore correggi se è così) poiché questo potrebbe influenzare il motivo per cui sono ponendo la domanda per cominciare:
- Il modello Saga è una sorta di broker che ha dato un'azione (utente finale, automatizzato, ecc. Essenzialmente qualsiasi cosa che cambierà i dati) divide quell'azione in attività aziendali e invia ciascuna di queste attività come messaggi a un bus dei messaggi che a sua volta lo invia alle rispettive radici aggregate di cui occuparsi.
- Queste radici aggregate possono operare in modo completamente autonomo (bella separazione delle preoccupazioni, grande scalabilità, ecc.)
- Una stessa istanza Saga non contiene alcuna logica aziendale, che è contenuta nelle radici aggregate a cui invia attività. L'unica "logica" contenuta nella Saga è la logica "di processo", (spesso implementata come una macchina a stati), che determina in base alle azioni ricevute (così come agli eventi di follow-up) cosa fare (ovvero: quali attività inviare)
- I modelli Saga implementano una sorta di modello di transazione distribuita. Vale a dire: quando una delle radici aggregate (che funzionano di nuovo in modo autonomo, senza sapere dell'esistenza di ciascuno) non riesce, l'intera azione potrebbe dover essere annullata.
- Questo viene implementato avendo tutte le radici aggregate, al completamento della loro relazione di attività alla Saga. (In caso di successo e di errore)
- Nel caso in cui tutte le radici aggregate restituiscano un successo, la macchina da stato interna se la Saga determina cosa fare dopo (o decide che è fatto)
- In caso di fallimento, la Saga rilascia a tutte le radici aggregate che hanno preso parte all'ultima azione una cosiddetta Azione di compensazione, ovvero: un'azione per annullare l'ultima azione che ciascuna delle radici aggregate ha fatto.
- Questo potrebbe semplicemente fare un "Meno 1 voto" 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 negozio di 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 ripetendo gli eventi memorizzati (essenzialmente come un registro eventi)
- Combinando i due (ovvero: lasciando che le radici aggregate utilizzino l'Evento-sourcing per esternalizzare il salvataggio delle loro modifiche prima di riferire alla Saga) si creano molte belle possibilità, una delle quali riguarda la mia domanda ...
Sentivo di aver bisogno di togliermelo dalla spalla, dato che è molto da capire in una volta sola. Dato questo contesto / mentalità (di nuovo, si prega di correggere se sbagliato)
la domanda: quando una radice aggregata riceve un'azione compensata e se quella radice aggregata ha esternalizzato i suoi cambiamenti di stato usando il sourcing degli eventi, l'azione compensata in tutte le situazioni non sarebbe solo una cancellazione dell'ultimo evento nell'archivio eventi per quello dato radice aggregata? (Supponendo che l'implementazione persistente consenta l'eliminazione)
Ciò avrebbe molto senso per me (e sarebbe un altro grande vantaggio di questa combinazione) ma, come ho detto, potrei fare queste ipotesi basate su una comprensione errata / incompleta di questi concetti.
Spero che questo non sia stato troppo prolisso.
Grazie.