Estoy diseñando un sistema que utiliza Event Sourcing, CQRS y microservicios. Tengo que entender que este no es un patrón poco común. Una característica clave del servicio debe ser la capacidad de rehidratarse / restaurarse de un sistema de registro. Los microservicios producirán comandos y consultas en un MQ (Kafka). Otros microservicios responderán (eventos). Los comandos y consultas se mantendrán en S3 con el propósito de auditar y restaurar.
El proceso de pensamiento actual era que, con el fin de restaurar el sistema, podríamos extraer el registro de eventos de S3 y simplemente enviarlo a Kafka.
Sin embargo, esto no reconoce cambios en productores y consumidores a lo largo del tiempo. El control de versiones en el nivel de comando / consulta parece ir de alguna manera hacia la solución del problema, pero no puedo entender cómo versionar a los consumidores de modo que pueda aplicar que cuando un comando, durante una restauración, se recibe y procesa, es exactamente el mismo [versión del] código que realiza el procesamiento, ya que fue la primera vez que se recibió el comando.
¿Hay algún patrón que pueda usar para resolver esto? ¿Alguien sabe de otros sistemas que anuncian esta característica?
EDITAR: Agregar un ejemplo.
Un 'comprador' envía una 'pregunta' a un 'vendedor' en mi sitio de subastas. El flujo tiene el siguiente aspecto:
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'
Ahora, como resultado de un nuevo requisito comercial, ajusto el consumidor del 'Servicio de preguntas' para que continúe contando todas las preguntas no leídas. El esquema de base de datos ha cambiado. Hasta ahora no teníamos ni idea de si el vendedor leía o no una pregunta. La última línea se convierte en:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
Dos comandos son problemas, uno antes del cambio, uno después del cambio. El 'conteo de preguntas no leídas' es igual a 1.
El sistema se bloquea. Restauramos al reproducir los comandos a través del nuevo código. Al final de la restauración, nuestro 'conteo de preguntas no leídas' es igual a 2. Aunque, en este ejemplo artificial, el resultado no es una catástrofe, el estado que ha sido restaurado no es lo que era antes.