Sto progettando un sistema che utilizza Event Sourcing, CQRS e microservices. Sono portato a capire che questo non è uno schema insolito. Una caratteristica chiave del servizio deve essere la capacità di reidratare / ripristinare da un sistema di registrazione. Microservices produrrà comandi e query su un MQ (Kafka). Altri microservizi risponderanno (eventi). I comandi e le query verranno mantenuti su S3 per scopi di controllo e ripristino.
L'attuale processo di pensiero era che, ai fini del ripristino del sistema, potevamo estrarre il registro eventi da S3 e semplicemente reinserirlo in Kafka.
Tuttavia, ciò non riesce a riconoscere i cambiamenti nei consumatori dei produttori e nel tempo. Il controllo delle versioni a livello di comando / query sembra andare in qualche modo verso la risoluzione del problema, ma non riesco a comprendere i consumatori di versioni in modo tale da poterlo applicare quando un comando, durante un ripristino, viene ricevuto ed elaborato, è esattamente lo stesso [versione del] codice che sta eseguendo l'elaborazione poiché era la prima volta che il comando è stato ricevuto.
Ci sono dei pattern che posso usare per risolvere questo? Qualcuno è a conoscenza di altri sistemi che pubblicizzano questa funzione?
EDIT: aggiunta di un esempio.
Un "acquirente" invia una "domanda" a un "venditore" sul mio sito di aste. Il flusso appare come segue:
UI -> Web App: POST /question {:text text :to seller-id :from user-id}
Web App -> MQ: SEND {:command send-question :args [text seller-id user-id]}
MQ -< Audit: <command + args appended to log in S3>
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
Ora, a seguito di un nuovo requisito aziendale, aggiusto il consumatore del "Servizio domande", per mantenere un conteggio di tutte le domande non lette. Lo schema del DB è cambiato. Non abbiamo avuto la nozione di se una domanda fosse o meno letta dal venditore, fino ad ora. L'ultima riga diventa:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
Due comandi sono problemi, uno prima della modifica, uno dopo la modifica. Il 'numero di domande non lette' è uguale a 1.
Il sistema si arresta in modo anomalo. Abbiamo ripristinato ripetendo i comandi tramite il nuovo codice. Alla fine del ripristino, il nostro 'conteggio di domande non lette' è uguale a 2. Anche se, in questo esempio forzato, il risultato non è una catastrofe, lo stato che è stato ripristinato è non ciò che precedentemente era .