Stiamo utilizzando CQRS + ES. ES è NEventStore (ferventemente JOliver EventStore). Abbiamo 2 aggregati in diversi comandi. Le proiezioni del secondo AR dipendono dai dati scritti dalle prime proiezioni AR nel modello letto. Il problema è che quando eseguiamo il software tutto procede così velocemente che a volte i due aggregati vengono mantenuti nell'archivio eventi con lo stesso datetime (colonna CommitStamp). Quando riproduciamo gli eventi li otteniamo dall'inizio ordinato dalla colonna CommitStamp. Ma se i due flussi sono con CommitStamp identici e sono stati ripresi nell'ordine sbagliato, le proiezioni del modello di lettura soffiano con eccezioni.Problema NEventStore con eventi di riproduzione
Qualche idea su come risolvere questo problema?
===============================
Ecco la discussione su questo problema a github https://github.com/NEventStore/NEventStore/issues/170
===============================
EDIT: Questo è il modo in cui attualmente riprodurre gli eventi . Ho cercato come funziona GetFrom (...) e si è scoperto che la colonna commitstamp non viene utilizzata per l'ordine. Dopotutto non c'è un ordine di commit. Quindi, se inizio a riprodurre gli eventi si può restituire un evento a partire da oggi, il prossimo un evento registrato 2 anni fa, accanto ecc
public void ReplayEvents(Action<List<UncommittedEvent>> whatToDoWithEvents, DateTime loadEventsAfterDate)
{
var eventPortion = store.Advanced.GetFrom(loadEventsAfterDate);
var uncommitedEventStream = new UncommittedEventStream();
foreach (var commit in eventPortion)
{
foreach (var eventMessage in commit.Events.ToList()))
{
uncommitedEventStream.Append(new UncommittedEvent(eventMessage.Body));
}
}
whatToDoWithEvents(uncommitedEventStream.ToList());
}
Questo è un [problema noto (# 159)] (https://github.com/NEventStore/NEventStore/issues/159); almeno per alcuni backend di persistenza. Quale motore di persistenza usi? – Marijn
Stiamo utilizzando MSSQL 2008 – mynkow
@Marijn: questo è esattamente il nostro problema. – mynkow