Да, что-то подобное спрашивалось, по крайней мере, пару раз раньше. Таким образом, я знаю ответ: вы просто воспроизводите события на новом обработчике, просто. Но попытка реального внедрения вызывает некоторые вопросы.
Я использую EventStore JOlivier, который выглядит неплохо. Для начала я проигнорирую концепцию SnapShots и просто найду способ вывести свои события. Все, что я мог получить, это код:
var commitList = Store.GetFrom(DateTime.UtcNow.AddSeconds(-1));
foreach (var commit in commitList)
{
foreach (var comittedEvent in commit.Events)
{
if (comittedEvent.Body is SomeDomainEvent)
Console.WriteLine(string.Format("Found interesting event: {0}", ((SomeDomainEvent)comittedEvent.Body).Value));
}
}
Первый вопрос здесь, конечно: это способ сделать это? У меня возникают проблемы с использованием параметра «GetFrom», поскольку это просто DateTime, и я не могу быть уверен, что все серверы синхронизированы по времени. Что если часы на одном сервере отстают на 1 минуту от другого? Или полчаса? Я также использую NServiceBus, поэтому новая очередь обработчиков будет накапливать события с определенного момента времени - но как я могу быть на 100% уверен, что здесь не пропущено 10 секунд? Скажите, пожалуйста, как вы получаете события из EventStore, будучи на 100% (а не на 99%) уверенным, что представление нового приложения полностью синхронизировано при запуске.
Также: Вы создаете специальный метод импорта в своем коде? Я имею в виду, предположим, что обработчик в моем новом приложении отправляет электронное письмо, когда оно обрабатывает «SomeDomainEvent». Я не хочу, чтобы он отправлял электронные письма для всех 10.000 старых событий. Как вы делаете этот «импорт» в практике / код?
Спасибо.