CQRS - come gestire le nuove tabelle del report (o: come importare tutta la storia dal negozio dell'evento)

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

  •  23-09-2019
  •  | 
  •  

Domanda

Ho studiato alcuni CQRS Esempi di implementazione (Java / .Net), che di sourcing utilizzo dell'evento come archivio di eventi e una semplice (No) memorizza SQL come il 'negozio report'.

Sembra tutto buono, ma mi sembra che manchi qualcosa in tutte le implementazioni di esempio.

Come gestire l'aggiunta di nuovi punti vendita di report / schermi, dopo che un'applicazione è andato in produzione? e come importare i dati esistenti (l'ultima) dal negozio evento per il nuovo negozio di rapporto?

Ie:

Immaginate un DDD base / CQRS guidata applicazione CRM. Ogni schermo (vista davvero) ha il proprio negozio report strutturati (una tabella SQL). Tutti questi punti di vista vengono aggiornati con i gestori ad ascoltare gli eventi di dominio (CustomerCreated / CustomerHasMoved, ecc).

Una caratteristica del CRM è che può registrare le telefonate (evento PhoneCallLogged). A causa di vincoli di tempo abbiamo solo implementato la registrazione di telefonate in V1 del CRM (visualizzazione e reporting di che ha gestito, che telefonata sarà attuato in V2)

Dopo un tempo di esecuzione della produzione, vogliamo implementare il 'report' di chiamate registrate telefonate per cliente e rappresentante di vendita.

Quindi, abbiamo bisogno di aggiungere alcune schermate (vista) e le tabelle dei rapporti di sostegno (nel negozio report) e riempirlo con i dati già raccolti nello Store di evento ...

Questo è dove mi si blocca mentre guardando i campioni che ho studiato. Essi non riescono a gestire l'importazione dei dati esistenti (storia) dal negozio evento a un (nuovo) negozio report.

Tutti i campioni del EventRepository (DomainRepository) hanno solo un metodo 'GetById' e 'Aggiungi', non supportano ottenere radici ALL aggregati in una sola volta per riempire una nuova tabella di report.

Senza questa importazione dei dati iniziale, i nuovi schermi vengono aggiornati solo per gli eventi appena accaduti. Non per le telefonate già registrate (perché non c'era ascoltatore rapporto per l'evento PhoneCallLogged)

Qualche suggerimento, raccomandazioni?

Grazie in anticipo,

Remco

È stato utile?

Soluzione

È rieseguire il gestore del registro eventi esistente (ad esempio, si gioca i vecchi eventi attraverso il nuovo gestore di eventi)

Si consideri ad esempio che si ... si dispone di una tonnellata di PhoneCallLoggedEvents nel registro eventi. Prendete le vostre nuove maniglie e riprodurre tutti i vecchi eventi attraverso di essa. È allora come è sempre stato in esecuzione e sarà solo continuerà a elaborare eventuali nuovi eventi che arrivano.

Saluti,

Greg

Altri suggerimenti

Per esempio, nel quadro Axon, questo può essere fatto attraverso:

JdbcEventStore eventStore = ...;

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

replayingCluster.startReplay();

Evento di replay è una zona che non è completamente documentato e manca di attrezzature maturare, ma qui ci sono alcuni punti di partenza:

Il 'EventRepository' contiene solo questi metodi perché è solo bisogno di loro produzione.

Quando si aggiunge un nuovo denormalizzazione per la segnalazione, è possibile inviare tutti gli eventi dall'inizio alla voi gestore.

È possibile farlo sul tuo sito di sviluppo in questo modo:

  • Caricare il registro eventi per il sito dev
  • Invia tutti gli eventi al gestore denormalizzazione
  • Spostare il nuovo gestore vista + al tuo sito di produzione
  • eventi Run accaduti inbetween
  • Ora sei pronto
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top