2010-11-21 12 views
9

Quando snapshot di aggregati non sono sincronizzati con il registro eventi, posso semplicemente riprodurre i miei eventi dalle istantanee precedenti (che si suppone siano sincronizzate). Lo stesso posso fare quando aggiungo/rimuovi nuovi campi o quando modifico la logica dei gestori esistenti.Come gestire le situazioni, quando il modello di lettura non è più sincronizzato con i registri eventi?

Nel caso in cui ho bisogno di aggiungere un nuovo modello di lettura (cioè nuova vista del report) posso fare di nuovo lo stesso - ripeterò i miei eventi.

Ma come devo gestire la situazione, quando il modello letto è diventato fuori sincrono con il registro eventi? La memorizzazione degli eventi e la pubblicazione avvengono in un'unica transazione, ma l'aggiornamento del modello di lettura si è verificato in un'altra transazione, che può non riuscire. La ripetizione di eventi fin dall'inizio può aiutare, ma può richiedere l'eternità. Ho bisogno di un concetto di istantanee per l'intero modello di lettura?

Come si risolve questo problema? Grazie.

risposta

7

Quale sarebbe il motivo dell'errore nel gestore di eventi? Quanto dura "l'eternità"?

Leggere gli aggiornamenti del modello raramente falliscono (a differenza dei gestori di comandi), poiché la logica all'interno è estremamente semplice. È probabile che i guasti siano causati da problemi transitori (interruzione IO/rete) e vengano gestiti automaticamente dal bus dei messaggi.

Tuttavia, se il modello di lettura è stato danneggiato per qualche motivo, il modo più semplice per reimpostarlo e scorrere gli eventi. Anche milioni di eventi richiederebbero un tempo ragionevole. Inoltre, puoi sempre utilizzare l'approccio Map-Reduce.

Si consiglia di non introdurre le istantanee per leggere i modelli. Penso che questo complica l'architettura senza alcun guadagno significativo.

+1

Grazie Rinat! In caso di eventi ripetuti fin dall'inizio si utilizza un thread di gestori di eventi? Perché nel caso userò più thread di lavoro posso ricevere risultati non corretti (mentre funzionerà in produzione a causa della natura del dominio - le condizioni di gara di diversi eventi non sono possibili quando si pubblica da utenti reali, ma possibile quando si pubblicano uno per uno per diversi thread di lavoro). Riconosce globalmente che dovremmo utilizzare solo un thread di lavoro per l'elaborazione degli eventi dall'inizio? Grazie per le vostre preziose risposte. –

+0

Buona chiamata. Preferisco evitare tali problemi di concorrenza eseguendo sempre non più di 1 thread per istanza di entità (comandi o eventi). Quindi possiamo avere più thread per i gestori di eventi, tuttavia ogni singola vista * istanza * (identificata da una certa identità) sarà sempre gestita solo da un singolo thread. Ovviamente, un thread può gestire più di una istanza o un tipo di visualizzazione alla volta. questo aiuta? –

+0

Grazie! Dopo alcuni giorni di analisi della tua risposta, ritengo di aver compreso i meccanismi della gestione degli eventi con più thread di lavoro. Apprezzo le tue risposte. –