Существуют различные примеры приложений и фреймворков, которые реализуют архитектуру CQRS + Event Sourcing, и большинство из них описывают использование обработчика событий для создания денормализованного представления из событий домена, хранящихся в хранилище событий.Как организовать обработчики событий Event Sourcing для построения модели чтения?
Одним из примеров размещения этой архитектуры является веб-api, который принимает команды на стороне записи и поддерживает запрос денормализованных представлений. Этот веб-api, вероятно, масштабируется для многих машин в ферме с балансировкой нагрузки.
Вопрос в том, где размещены обработчики событий модели чтения?
Возможные сценарии:
Размещенные в одном сервисе окна на отдельном хосте. Если это так, разве это не создало бы одну точку отказа? Это, вероятно, тоже осложняет развертывание, но это гарантирует единственный поток выполнения. Недостатком является то, что модель чтения может проявлять повышенную задержку.
Хостинг как часть веб-api. Если я использую EventStore, например, для хранения событий и обработки подписки на события, будет выполняться несколько обработчиков (по одному в каждом процессе веб-фермы) для каждого отдельного события и, таким образом, вызвать конфликты в обработчиках по мере их чтения/писать в свой магазин для чтения? Или мы гарантируем, что для данного агрегатного экземпляра все его события будут обрабатываться по очереди в порядке исполнения событий?
Я склоняюсь к сценарию 2, поскольку он упрощает развертывание, а также поддерживает диспетчеров процессов, которым также необходимо прослушивать события. Такая же ситуация, хотя только один обработчик событий должен обрабатывать одно событие.
Может ли EventStore обрабатывать этот сценарий? Как другие обрабатывают обработку событий в согласованных архитектурах?
EDIT:
Чтобы уточнить, я говорю о процессе извлечения данных о событиях в Денормализованные таблицы, а не чтение этих таблиц для «Q» в CQRS.
Я предполагаю, что я ищу варианты того, как мы должны «внедрять и развертывать обработку событий для чтения моделей/sagas/etc, которые могут поддерживать избыточность и масштабирование, если, конечно, обрабатывается обработка событий в идемпотентном порядке.
Я прочитал два возможных решения для обработки данных, сохраненных как события в хранилище событий, но я не понимаю, какой из них следует использовать над другим.
автобус Event
Шина событие/очередь используется для публикации сообщений после того, как событие сохраняется, как правило, путем реализации хранилища. Заинтересованные стороны (подписчики), такие как модели чтения или саги/менеджеры процессов, используют «автобус/очередь» каким-то образом, чтобы обработать его идемпотентным способом.
Если очередь представляет собой pub/sub, это означает, что каждая нисходящая зависимость (read model, sagas и т. Д.) Может поддерживать только один процесс для подписки на очередь.Более одного процесса означают, что каждая обработка одного и того же события, а затем конкурирует, чтобы внести изменения вниз по течению. Идемпотентная обработка должна заботиться о проблемах согласованности/параллелизма.
Если очередь является конкурирующим потребителем, у нас есть хотя бы возможность размещения абонентов в каждом узле веб-фермы для резервирования. Хотя для этого требуется очередь для каждой нисходящей зависимости; один для сагов/менеджеров процессов, по одному для каждой модели чтения и т. д., и поэтому репозиторий должен публиковать для каждого из них для возможной согласованности.
Подписка/корм
Подписки/подача, где заинтересованные стороны (абонентская) читать поток событий по требованию и получать события из известного контрольно-пропускного пункта для обработки в модель чтения.
Это отлично подходит для воссоздания прочитанных моделей, если это необходимо. Однако в соответствии с обычным пабом/подпрограммой, казалось бы, должен использоваться только один процесс подписчика на нисходящую зависимость. Если мы зарегистрируем несколько подписчиков для одного потока событий, например, в каждом узле веб-фермы, все они будут пытаться обрабатывать и обновлять одну и ту же соответствующую модель чтения.
Хорошо q для группы ddd-cqrs-es slack или электронной почты –
Когда вы говорите, прочитанная модель, вы хотите запросить денормализованные таблицы, где должно быть размещено приложение-запрос? – sagar
Спасибо, sagar. Я добавил еще несколько вопросов к вопросу. – Mark