Мы используем CQRS + ES. ES - это NEventStore (далее JOliver EventStore). У нас есть 2 агрегата в разных командах. Проекции второго AR зависят от данных, записанных первыми проекциями AR в модели чтения. Проблема в том, что когда мы запускаем программное обеспечение, все происходит так быстро, что иногда два агрегата сохраняются в хранилище событий с одинаковыми датами времени (столбец CommitStamp). При воспроизведении событий мы получаем их с самого начала в порядке столбца CommitStamp. Но если эти два потока имеют идентичный CommitStamp и взяты в неправильном порядке, проекции модели чтения срываются с исключениями.
Есть идеи, как решить эту проблему?
===============================
Вот обсуждение этой проблемы на github https://github.com/NEventStore/NEventStore/issues/170
===============================
РЕДАКТИРОВАТЬ: именно так мы сейчас воспроизводим события. Я искал, как работает GetFrom (...), и оказалось, что столбец commitstamp не используется для упорядочивания. Ведь не существует порядка совершения. Итак, если я начну воспроизводить события, он может вернуть событие с сегодняшнего дня, следующее событие, записанное 2 года назад, следующее и т. Д.
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());
}