CQRS - cómo manejar las nuevas tablas de informes (o: cómo importar toda la historia de la tienda de evento)

StackOverflow https://stackoverflow.com/questions/2559096

  •  23-09-2019
  •  | 
  •  

Pregunta

He estudiado algunos ejemplos de implementaciones CQRS (Java / .Net), que el uso de abastecimiento evento como el almacén de eventos y un simple (n) SQL almacena como la 'tienda de informe'.

Parece todo bien, pero me parece que falta algo en todas las implementaciones de muestra.

Como manejar la adición de nuevas tiendas de informes / pantallas, después de una aplicación ha ido en la producción? y la forma de importar los datos existentes (última) de la tienda de evento a la nueva tienda de informe?

Es decir:

Imagine un DDD básica / CQRS impulsada aplicación CRM. Cada pantalla (vista en realidad) tiene su propia tienda de informe estructurado (una tabla de SQL). Todos estos puntos de vista se actualizan mediante controladores de escucha a los acontecimientos de dominio (CustomerCreated / CustomerHasMoved, etc).

Una de las características de la CRM es que puede registrar llamadas telefónicas (evento PhoneCallLogged). Por falta de tiempo sólo implementado el registro de llamadas telefónicas en V1 de la CRM (visualización y presentación de informes de los que manejan los cuales llamada telefónica será implementado en V2)

Después de un tiempo de funcionamiento de la producción, queremos poner en práctica el 'Informes' de las llamadas registradas teléfono por cliente y el representante de ventas.

Así que tenemos que añadir algunas pantallas (vistas) y las tablas de informes de soporte (en la tienda de informe) y llenarlo con los datos ya recogidos en el Evento tienda ...

Esto es donde se queda bloqueado mientras mira a las muestras que he estudiado. No manejan la importación de los datos existentes (historia) de la tienda de evento a un (nuevo) tienda de informe.

Todas las muestras de la EventRepository (DomainRepository) sólo tienen un método 'GetById' y 'Añadir', que no son compatibles con las raíces conseguir todo el agregado en vez de llenar una nueva tabla de informe.

Sin esta importación de datos inicial, las nuevas pantallas solamente se actualizan para los eventos ocurridos recientemente. No para las llamadas telefónicas ya registrados (porque no había ningún informe de escucha para el evento PhoneCallLogged)

Cualquier sugerencia, recomendaciones?

Gracias de antemano,

Remco

¿Fue útil?

Solución

volver a ejecutar el controlador en el registro de eventos existentes (por ejemplo, reproducir los viejos eventos a través del nuevo controlador de eventos)

Considere ejemplo ... usted tiene una tonelada de PhoneCallLoggedEvents en su registro de eventos. Tome sus nuevas manijas y jugar todos los viejos eventos a través de él. Es entonces como siempre lo ha estado funcionando y simplemente continuar procesando los nuevos eventos que llegan.

Saludos,

Greg

Otros consejos

Por ejemplo en el Marco Axon, esto se puede hacer mediante:

JdbcEventStore eventStore = ...;

ReplayingCluster replayingCluster = new ReplayingCluster(
            new SimpleCluster("replaying"),
            eventStore,
            new NoTransactionManager(),
            0,
            new BackloggingIncomingMessageHandler());

replayingCluster.startReplay();

replay eventos es un área que no está completamente documentado y carece de madurar herramientas, pero aquí hay algunos puntos de partida:

El 'EventRepository' sólo contiene estos métodos, ya que sólo los necesita en la producción.

Al agregar un nuevo desnormalización para la presentación de informes, puede enviar todo caso desde el principio hasta que manipulador.

Se puede hacer esto en su sitio de desarrollo de esta manera:

  • Cargar el registro de eventos para el sitio dev
  • Enviar todos los eventos al controlador de desnormalización
  • Mover su nuevo manejador de vista + a su sitio de producción
  • Ejecutar eventos que ocurrieron entre medio
  • Ahora ya está listo
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top