Axon создает aggregate внутри saga

#domain-driven-design #axon

#дизайн, управляемый доменом #аксон

Вопрос:

Я не уверен, как правильно задать этот вопрос, но вот он:

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

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

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

Спасибо

Комментарии:

1. Крошечная мелочь, но я бы переименовал заголовок вашего вопроса в «Axon — creating Aggregate внутри Saga». AxonIQ — это название компании, но не продукта. 😉

Ответ №1:

Решение, которое вы опубликовали, определенно сработало бы. Позвольте мне объяснить сценарий, который вы затронули здесь, хотя и для ссылок других людей тоже.

В приложении Axon Framework 4.x любой компонент обработки событий, а следовательно, и ваши экземпляры Saga, поддерживаются TrackingEventProcessor . Процессор отслеживания событий «отслеживает», в какой точке потока событий он обрабатывает события. Он хранит эту информацию через a TrackingToken , для которого TokenStore часть работы делегируется.

Если вы не указали TokenStore однако, у вас будет в памяти TrackingTokens для каждого процессора отслеживания событий. Это означает, что при перезапуске ваш процессор отслеживания событий думает: «Ой, я еще не выполнял никакой обработки событий, позвольте мне начать с начала времен». Из-за этого ваши экземпляры Saga будут каждый раз запускать новые, пытаясь воссоздать данный экземпляр Aggregate.

С этого момента указание TokenStore , как вы это сделали, решило возникшую у вас проблему.

Обратите внимание, что в среде Spring Boor, например, при наличии Spring Data starter, Axon автоматически создаст JpaTokenStore для вас.

Ответ №2:

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

Базовая конфигурация spring:

     @Bean
    fun tokenStore(client: MongoClient): TokenStore = MongoTokenStore.builder()
        .mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build())
        .serializer(JacksonSerializer.builder().build())
        .build()