Источник событий — данные, предоставленные команде, и данные, сохраненные в событиях

#event-sourcing

#источник событий

Вопрос:

Я изучаю источники финансирования мероприятий, и у меня есть несколько мыслей, которые мне нужно обдумать.

Возьмем, к примеру, интернет-магазин —

Клиент добавляет товар в корзину и сохраняет свой заказ.

Обработчик команды может создать заказ в корне агрегата клиентов и добавить событие OrderCreated, которое содержит идентификатор клиента, идентификатор заказа, идентификатор товара, количество и цену за единицу. Все довольно прямолинейно, но что, если агрегатору нужно было проверить, есть ли этот товар в специальном предложении?

Если бы это была, например, служба корзины, подписалась бы она на события из службы каталога и сохранила бы свои собственные проекции службы каталога, которые затем могла бы использовать, чтобы служба корзины включала в себя хранилище событий, а также некоторую форму проекции службы каталога?

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

Ответ №1:

что, если агрегату необходимо проверить, был ли этот элемент в специальном предложении?

Для получения необходимой информации необходимо выполнить запрос.

С точки зрения совокупности эти данные являются внешними, поэтому ему (или обработчику, отправляющему ему команду) требуется запрос для доступа к этой информации.

Как работать с запросом, зависит от вас (есть плюсы и минусы для каждого способа), обработчик запроса может:

  • Вызовите репозиторий, который загружает агрегат, и проверьте наличие специального предложения (вы также можете подумать о том, чтобы иметь источник событий только в одной части вашей системы, и чтобы эта часть использовала другой способ хранения dara или нет)
  • Выполните удаленный вызов API службы каталога, чтобы проверить наличие специального предложения
  • Выполните запрос к локальной базе данных, которая заполняется событиями чтения, отправленными службой каталога и сохраненными «локально» в службе корзины