Как хранить данные саг? - PullRequest
0 голосов
/ 06 ноября 2018

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

Я также читал, что саги могут быть агрегатами, что имеет смысл для меня.

Теперь я смоделировал процесс регистрации, используя событие saga: on RegistrationStarted, он посылает команду ReserveEmail, которая вызовет EmailReserved или EmailReservationFailed данные, если электронная почта свободна или нет. Затем слушатель отправит ссылку для проверки или сообщение о том, что учетная запись уже существует.

Я хотел бы использовать данные из события RegistrationStarted в этом прослушивателе (скажем, IP-адрес и агент пользователя). Как мне это сделать?

  • Хранить эти данные в саге? Но они не используются для защиты инвариантов.
  • Нажав их через команду ReserveEmail и полученное событие? Звучит скучно.
  • Проецировать сагу на прочитанную модель? Как насчет возможной последовательности?
  • Другой способ?

1 Ответ

0 голосов
/ 06 ноября 2018

Ринат Абдуллин написал хороший обзор саг / менеджеров процессов .

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

List[Command] processManager(List[Event] events)

Нажав их через команду ReserveEmail и полученное событие?

Да, это обычный подход; мы получаем список [RegistrationStarted] и используем его для вычисления результата [ReserveEmail]. Позже мы получим [RegistrationStarted, EmailReserved], и мы можем использовать это для вычисления следующего набора команд (если есть).

Звучит скучно.

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

Хранить эти данные в саге? Но они не используются для защиты инвариантов.

Обычно вы будете хранить события в сагах (чтобы отслеживать, что произошло). Это дает вам копию данных, предоставленных на мероприятии. У вас нет инварианта для защиты, потому что вы просто кэшируете копию решения, принятого где-то еще . Обычно у вас не будет менеджера процессов, выполняющего запросов для сбора дополнительных данных.

А как насчет возможной последовательности?

По своей природе саги всегда будут "в конце концов последовательными"; «Состояние» экземпляра саги - это просто кэшированные копии данных, контролируемых в другом месте. Данные, вероятно, устарели на наносекунды к тому времени, как их увидит сага, нет смысла притворяться, что данные «сейчас».

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

Уди Дахан, пишет о CQRS :

Вот самое убедительное указание, которое я могу вам дать, чтобы знать, что вы правильно выполняете CQRS: ваши совокупные корни - саги.

...