Estou projetando um sistema que usa Event Sourcing, CQRS e microsserviços. Sou levado a entender que esse não é um padrão incomum. Um recurso essencial do serviço precisa ser a capacidade de reidratar / restaurar de um sistema de registro. Os microsserviços produzirão comandos e consultas em um MQ (Kafka). Outros microsserviços responderão (eventos). Comandos e consultas serão mantidos no S3 para fins de auditoria e restauração.
O processo atual de pensamento era que, para fins de restauração do sistema, poderíamos extrair o log de eventos do S3 e simplesmente enviá-lo ao Kafka.
No entanto, isso não reconhece mudanças nos produtores e consumidores ao longo do tempo. O controle de versão no nível de comando / consulta parece ajudar bastante a solucionar o problema, mas não consigo entender os consumidores de controle de versão, de modo que eu possa impor que, quando um comando, durante uma restauração, é recebido e processado, é exatamente o mesmo [versão do] código que está executando o processamento, pois foi a primeira vez que o comando foi recebido.
Existem padrões que posso usar para resolver isso? Alguém conhece outros sistemas que anunciam esse recurso?
EDIT: Adicionando um exemplo.
Um 'comprador' envia uma 'pergunta' a um 'vendedor' no meu site de leilões. O fluxo tem a seguinte aparência:
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'
Agora, como resultado de um novo requisito comercial, ajusto o consumidor do 'Serviço de perguntas' para persistir uma contagem de todas as perguntas não lidas. O esquema do banco de dados foi alterado. Até o momento, não tínhamos noção se uma pergunta foi lida ou não pelo vendedor. A última linha se torna:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
Dois comandos são problemas, um antes da alteração, um após a alteração. A 'contagem de perguntas não lidas' é igual a 1.
O sistema trava. Restauramos repetindo os comandos através do novo código. No final da restauração, nossas 'perguntas não lidas contam' são iguais a 2. Mesmo que, neste exemplo artificial, o resultado não seja uma catástrofe, o estado que foi restaurado não é o que era anteriormente.