Я не касается командных сообщений так, как пользователь будет знать немедленно ли не его успешным.
Вероятно, вы должны иметь дело с командами, так как это те, которые фактически заставляют книгу записи меняться. Да, счастливый путь прост, но что вы ожидаете от пользователя, когда их команда не будет подтверждена?
Что касается меня - это события. При подключении к событию агрегатного номера версии, можно ли сделать операцию idempotent?
Имейте в виду, что события, полученные из источников, загружаются из истории, а не только из событий, пролетающих (т.е. подписки). Вы собираетесь загружать эти объекты из книги записи, поэтому вам будет предоставлена точная история. Вам не нужно беспокоиться об изменении событий, потому что они неизменны. Точно так же вам не нужно беспокоиться об изменении истории, потому что история добавляется только.
Другими словами, объект, связанный с вашим событием, поддерживает метод apply(Event)
, и вам не нужно его вообще охранять, вы просто загружаете события в порядок.
Другой способ - одно и то же: история вашей сущности поставляется как DocumentMessage
, а не как последовательность EventMessages
.
Проблемы, похожие на проекции, которые собраны из более чем одной истории событий.
Если ваша организация прослушивает/подписывается на некоторые другие события сущностей (т. Е. Ваш объект является процессором событий), вам нужно будет беспокоиться об идемпотентности. Обратите внимание, что в этом случае для событий есть два разных контекста: события в истории самого процессора событий (т. Е. События, описывающие изменения состояния процессора событий), и события, которые процессор реагирует на , Иными словами, у вас есть apply(Event myStateChanged)
vs when(Event somethingHappenedSomewhereElse)
Вам не нужно беспокоиться о idempotency для первого (см. Выше); вы убедитесь, что вы реагируете один раз на мероприятие, отслеживая это событие в своей собственной истории. Ваш процессор может быть конечным автоматом (поэтому события естественно идемпотентны), или вы можете отслеживать идентификаторы событий событий, на которые вы подписаны, и затем убедитесь, что вы не реагируете более одного раза и т. Д.
Как ни странно, есть места, где появляется «версия агрегата» - они находятся в обработчиках команд. Две распространенные формы: во-первых, команда может ориентироваться на определенную версию совокупности, к которой применимо (сразу же решая вашу проблему идемпотент); во-вторых, вы увидите отслеживание номера версии для защиты от одновременной модификации.
Когда события считываются из вашего хранилища событий, они должны быть уже в правильном порядке вместе с правильным номером версии.Будет ли эта проверка не лишней в таком случае? Возможно, вы можете несколько расширить вопрос, с которым вы столкнулись. –