CQRS - как обрабатывать новые таблицы отчетов (или: как импортировать ВСЕ истории из хранилища событий) - PullRequest
12 голосов
/ 01 апреля 2010

Я изучил некоторые примеры реализации CQRS (Java / .Net), которые используют источник событий в качестве хранилища событий и простые (нет) хранилища SQL в качестве «хранилища отчетов».

Выглядит все хорошо, но мне кажется, что-то не хватает во всех примерах реализации.

Как справиться с добавлением новых хранилищ / экранов отчетов после запуска приложения? и как импортировать существующие (последние) данные из хранилища событий в новое хранилище отчетов?

Т.е.:

Представьте себе базовое приложение CRM, управляемое DDD / CQRS. Каждый экран (на самом деле представление) имеет свое собственное хранилище структурированных отчетов (таблица SQL). Все эти представления обновляются с использованием обработчиков, прослушивающих события домена (CustomerCreated / CustomerHasMoved и т. Д.).

Одна особенность CRM заключается в том, что он может регистрировать телефонные звонки (событие PhoneCallLogged). Из-за нехватки времени мы реализовали регистрацию телефонных звонков только в V1 CRM (просмотр и отчетность о том, кто обрабатывал, какой телефонный звонок будет реализован в V2)

Через некоторое время после запуска мы хотим внедрить «отчетность» о зарегистрированных телефонных звонках для каждого клиента и торгового представителя.

Итак, нам нужно добавить несколько экранов (представлений) и вспомогательных таблиц отчетов (в хранилище отчетов) и заполнить их данными, уже собранными в хранилище событий ...

Вот где я застреваю, глядя на образцы, которые я изучал. Они не обрабатывают импорт существующих (исторических) данных из хранилища событий в (новое) хранилище отчетов.

Все примеры EventRepository (DomainRepository) имеют только методы «GetById» и «Add», они не поддерживают получение ВСЕХ агрегатных корней за один раз для заполнения новой таблицы отчета.

Без этого первоначального импорта данных новые экраны обновляются только для вновь возникших событий. Не для уже зарегистрированных телефонных звонков (потому что не было прослушивателя отчетов для события PhoneCallLogged)

Есть предложения, рекомендации?

Заранее спасибо,

РЕМКО

Ответы [ 3 ]

8 голосов
/ 14 апреля 2010

Вы повторно запускаете обработчик в существующем журнале событий (например, вы проигрываете старые события через новый обработчик событий)

Рассмотрим пример ... у вас есть тонна PhoneCallLoggedEvents в вашем журнале событий. Возьмите свои новые Ручки и играйте через них все старые события. Тогда он всегда работает и будет продолжать обрабатывать новые поступающие события.

Приветствия

Грег

2 голосов
/ 23 января 2016

Например, в Axon Framework это можно сделать с помощью:

JdbcEventStore eventStore = ...;

ReplayingCluster replayingCluster = new ReplayingCluster(
            new SimpleCluster("replaying"),
            eventStore,
            new NoTransactionManager(),
            0,
            new BackloggingIncomingMessageHandler());

replayingCluster.startReplay();

Воспроизведение событий - это область, которая не полностью документирована и в которой отсутствуют зрелые инструменты, но вот некоторые отправные точки:

1 голос
/ 14 апреля 2010

EventRepository содержит только эти методы, потому что они нужны вам только в производстве.

Добавляя новую денормализацию для отчетов, вы можете отправить все события от начала до вашего обработчика.

Вы можете сделать это на своем сайте разработки следующим образом:

  • Загрузите ваш журнал событий на сайт разработчика
  • Отправка всех событий вашему обработчику денормализации
  • Переместите новый обработчик представления + на производственную площадку
  • Запуск событий, которые произошли между
  • Теперь вы готовы
...