2010-04-01 7 views
11

He estudiado algunas implementaciones de muestra CQRS (Java/.Net) que utilizan fuentes de eventos como la tienda de eventos y un simple (No) SQL almacena como la 'tienda de informes'.CQRS - cómo manejar nuevas tablas de informes (o: cómo importar TODO el historial desde la tienda de eventos)

Se ve muy bien, pero parece que me falta algo en todas las implementaciones de muestra.

¿Cómo gestionar la adición de nuevas tiendas/pantallas de informes, después de que una aplicación entre en producción? y cómo importar los datos existentes (más recientes) de la tienda de eventos a la nueva tienda de informes?

Es decir:

imaginar una básicas DDD/CQRS impulsadas aplicación CRM. Cada pantalla (ver realmente) tiene su propio almacén de informes estructurados (una tabla SQL). Todas estas vistas se actualizan usando controladores que escuchan los eventos de dominio (CustomerCreated/CustomerHasMoved, etc.).

Una característica del CRM es que puede registrar llamadas telefónicas (evento PhoneCallLogged). Debido a limitaciones de tiempo, solo implementamos el registro de llamadas telefónicas en V1 del CRM (visualización e informes de quién manejó qué llamada telefónica se implementará en V2)

Después de un tiempo de producción, queremos implementar el ' informes de llamadas telefónicas registradas por cliente y representante de ventas.

Así 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 la tienda Evento ...

que es donde se queda bloqueado mientras miraba las muestras que estudié. No manejan la importación de datos (históricos) existentes desde la tienda de eventos a una (nueva) tienda de informes.

Todas las muestras del EventRepository (DomainRepository) solo tienen un método 'GetById' y 'Add', no son compatibles con TODAS las raíces agregadas para llenar una nueva tabla de informes.

Sin esta importación inicial de datos, las nuevas pantallas solo se actualizan para los eventos nuevos. No para las llamadas ya registradas (porque no hubo un oyente de informe para el evento PhoneCallLogged)

¿Alguna sugerencia, recomendaciones?

Gracias de antemano,

Remco

Respuesta

8

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

Considérese que ejemplo .. .tiene un montón de PhoneCallLoggedEvents en su registro de eventos. Toma tus nuevos Mangos y juega a todos los viejos eventos a través de él. Es como si siempre hubiera estado funcionando y simplemente continuará procesando los eventos nuevos que lleguen.

Saludos,

Greg

+0

Así que, básicamente, tendrá que integrar una especie de corredor evento de una sola vez (informe de impor t) en su proceso de implementación? –

+0

Y necesitará acceso de 'Consulta' a la tienda de eventos: store.GetAllEvents (); Esto parece contrario a la intuición porque (como dije) Todas las implementaciones de EventStore que he visto (tanto .net/java) no permiten dicho acceso de lectura ... –

+1

Normalmente las implementaciones provistas solo contienen lo que se necesita en tiempo de ejecución, pero no lo que se necesita para el mantenimiento. – thinkbeforecoding

1

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

Al agregar una nueva desnormalización para informes, puede enviar todos los eventos desde el inicio a su controlador.

Usted puede hacer esto en su sitio el desarrollo de esta manera:

  • Carga tu registro de eventos para el sitio dev
  • Enviar todos los eventos al controlador de desnormalización
  • Mueva su nueva visión + manejador a su planta de producción
  • Ejecutar eventos que ocurrieron entre medio
  • Ahora ya está listo
+0

Esto no es realmente factible en la forma que describes. No tenemos acceso a los datos de producción (eventos). Pero según su respuesta y la de Greg, ahora veo que necesitará algún tipo de componente de importación de una sola vez (Event Runner) que se ejecuta solo una vez cuando se implementa el nuevo controlador en la producción. –

+0

¿Qué le impide recibir los eventos? Una vez que sucedió, nunca cambiarán, por lo que no hay riesgo de hacer una copia. Pero de todos modos, necesitará un componente (o proceso) que lea todos los eventos y llame al controlador. – thinkbeforecoding

2

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(); 

repetición eventos es un área que no está completamente documentado y carece de utillaje maduro, pero aquí hay algunos puntos de partida:

Cuestiones relacionadas