Аксон воссоздает агрегатное состояние не ясно - PullRequest
2 голосов
/ 23 октября 2019

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

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

При настройке приложения я использую агрегатное представление для сохранения данныхМне нужно в базу данных. Теперь я чувствую, что события просто хранятся в хранилище событий и используются только для воссоздания агрегата после вызова команды. Есть ли что-нибудь еще, что я должен сделать с хранимыми событиями и воссозданием совокупности? Не должен ли я, например, воссоздать весь агрегат вместо того, чтобы извлекать агрегированное представление из моей базы данных по идентификатору для его обновления.

1 Ответ

1 голос
/ 23 октября 2019

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

...