Как использовать EventStore для создания новых представлений приложений на практике?

Да, что-то подобное уже задавали как минимум пару раз. Таким образом, я знаю ответ: вы просто воспроизводите события в новом обработчике, просто. Но попытка реальной реализации вызывает некоторые вопросы.

Я использую EventStore JOlivier, который кажется хорошим. Для начала я проигнорирую концепцию снэпшотов и просто посмотрю, как вывести свои события. Все, что я мог сделать, это этот код:

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 старых событий. Как вы делаете этот импорт в praxis/code?


person Werner    schedule 17.08.2011    source источник


Ответы (1)


  1. Добавьте к этому идемпотентность. Джонатан рассказывает об этом в своих сообщениях в блоге о проекте EventStore (v2). По крайней мере, один раз доставка сообщения в сочетании с идемпотентностью гарантирует, что вы не будете обрабатывать одно и то же сообщение дважды. Таким образом, отставание на несколько минут (даже полчаса) не имеет большого значения. Вам также потребуется интегрировать это поведение идемпотентности в ваши обработчики NSB (например, в качестве первого обработчика).
  2. Если ваши обработчики имеют побочные эффекты (что кажется странным, так как у меня сложилось впечатление, что вы воспроизводили, чтобы получить новый отчет/представление), то нет никакого вреда в использовании текущего времени и времени события, чтобы решить, следует ли отправлять электронные письма для вещей из мимо. В качестве альтернативы вы можете составить свои обработчики (используя IoC) с NullEmailSender:IEmailSender, который ничего не делает (потому что вы знаете, что путь, по которому вы идете, — это воспроизведение прошлого).
person Yves Reynhout    schedule 21.08.2011
comment
Идемпотентность в помощь да. И еще очень важно: мое понимание обработчиков событий было неверным. Я думал о бизнес-логике внутри этих обработчиков, что было недоразумением, спасибо. - person Werner; 26.09.2011