Аксон воссоздает агрегатное состояние неясно

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

  • Например, когда мне следует вручную воссоздать агрегат?
  • Какая польза от воссоздания агрегата каждый раз, когда я вызываю команду?

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


person Gisrou8    schedule 23.10.2019    source источник


Ответы (1)


Идея, лежащая в основе Источника событий для вашего агрегата, заключается в том, что эти события являются источником для любой модели в вашей системе.

Таким образом, если вы создаете специальную командную модель для обработки описанных вами команд, то эта модель (которая с точки зрения Axon является классом аннотации @Aggregate(Root)) будет получена из событий, которые она опубликовала.

Кроме того, вы можете ввести любой тип модели запроса, какой захотите; представление RDBMS, решение для текстового поиска (например, Elastic), база данных временных рядов, вы называете это. Однако любая из этих моделей запросов по-прежнему является частью того же корневого приложения, в котором находится ваш агрегат. Поскольку у вас есть события в качестве средства уведомления других о принимаемых решениях, естественно (повторно) использовать их для обновления всех ваших моделей запросов. также.

Совершенно верно, что вы не склонны использовать Event Sourcing для своих агрегатов в Axon, который с его точки зрения называется State-Stored Aggregate. Однако, если вы сделаете это, вы вернетесь к отдельным моделям в отдельном механизме хранения без единого источника истины.

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

Например, когда мне следует вручную воссоздать агрегат?

Вы никогда не будете склонны воссоздавать агрегат как командную модель, поскольку фреймворк делает это за вас. Если у вас есть зеркальный агрегат модели запроса, вы должны воссоздавать его всякий раз, когда вы добавляете / удаляете / изменяете поля в модели. Или, если вы представили совершенно новые модели.

Какая польза от воссоздания агрегата каждый раз, когда я вызываю команду?

Преимущество его воссоздания каждый раз - гарантия того, что вы всегда будете использовать последнее состояние. Даже если между выпуском вашего приложения вы добавили / изменили / удалили новые поля. @EventSourcingHandler аннотированные методы просто заполнят их, и вам не нужно будет, например, писать сценарий базы данных, чтобы настроить его напрямую на уровне базы данных.


В заключение следует отметить, что причина такого подхода полностью лежит в архитектурных концепциях, поддерживаемых Axon. Вы можете прочитать о них на странице AxonIQ Архитектурные концепции, если хотите; Я уверен, что это еще больше прояснит ситуацию.

Надеюсь, это поможет вам @ Gisrou8! Если нет, ответьте, пожалуйста, на другие вопросы, я бы с радостью объяснил кое-что еще.


Обновление: дополнительное объяснение модели команд

Из комментария Gisrou8, помещенного под моим ответом, становится очевидным, что «беспокойство» с этим подходом в основном связано с состоянием Агрегата.

Как уже упоминалось в моем предыдущем ответе, Агрегат, который можно смоделировать с помощью Axon Framework, должен рассматриваться в настройке Event Sourced как командная модель в системе CQRS.

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

Таким образом, единственные поля, которые вы должны ввести в свой агрегат вместе с агрегатным идентификатором, - это поля, необходимые для принятия этих решений. Это то, для чего предназначена модель команд, поэтому не беспокойтесь об этом.

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

person Steven    schedule 23.10.2019
comment
Спасибо за быстрый ответ! Часть, с которой я борюсь, заключается в том, что я не использую данные внутри агрегата, например, для вставки в свой агрегатный вид, но я использую данные, которые передаю через команды. Поэтому мне было интересно, ошибочен ли мой подход, и я должен использовать данные из воссозданного агрегата вместо информации, которую я передаю через свою команду. Такое чувство, что я вообще ничего не делаю с последним состоянием агрегата? Я использовал пример заказа еды, предоставленный Axon, в качестве примера для создания своего приложения. - person Gisrou8; 23.10.2019
comment
Аааа там. Определенно одна из странностей, когда вы впервые начинаете работу с системой DDD / CQRS / ES. Я обновлю свой ответ, чтобы прояснить эту часть @ Gisrou8 - person Steven; 24.10.2019
comment
Ах, теперь я понял! Спасибо! - person Gisrou8; 24.10.2019