Как использовать EventStore для создания новых видов приложений в практике? - PullRequest
1 голос
/ 17 августа 2011

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

Я использую 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 старых событий. Как вы делаете этот «импорт» в практике / код?

Спасибо.

1 Ответ

1 голос
/ 21 августа 2011
  1. Добавить идемпотентность в смесь. Джонатан рассказывает об этом в своих постах в блоге о проекте EventStore (v2). По крайней мере, однажды доставка сообщения в сочетании с идемпотентностью позволит вам не обрабатывать одно и то же сообщение дважды. Таким образом, отсутствие нескольких минут (даже получаса) не имеет большого значения. Вам также необходимо интегрировать это поведение идемпотентности в свои обработчики NSB (например, в качестве первого обработчика).
  2. Если у ваших обработчиков есть побочные эффекты (что кажется странным, так как у меня сложилось впечатление, что вы воспроизводили, чтобы получить новый отчет / просмотр), тогда нет никакого вреда в использовании текущего времени и времени события, чтобы решить, следует ли отправлять электронные письма для вещи из прошлого. В качестве альтернативы вы можете составить свои обработчики (используя IoC) с NullEmailSender: IEmailSender, который ничего не делает (потому что вы знаете, что путь, по которому вы идете, - это воспроизведение прошлого).
...