Axon framework - хранение списка событий

У меня есть список лиц List<Entity> entitiesList. Мне нужно опубликовать и сохранить список событий для каждой сущности. У меня есть агрегат для Entity, все необходимые обработчики, CreateEntityCommand и EntityCreatedEvent. В настоящее время я делаю: 1. Создаю команды в цикле и отправляю эти команды через командный шлюз для каждого объекта из entityList.

for (Entity entity : entitiesList) {
               CreateEntityCommand createEntityCommand = new CreateEntityCommand();
                …   here I set command’s fields  …
               commandGateway.send(createEntityCommand);
}
  1. Внутри совокупности у меня есть
@CommandHandler
    public EntityAggregate(CreateEntityCommand createAlertCommand) {
            EntityCreatedEvent entityCreatedEvent = new EntityCreatedEvent();
                   …. here I set event’s fields
            AggregateLifecycle.apply(entityCreatedEvent);

    }

В результате события создаются, публикуются и сохраняются в таблице DomainEventEntry внутри цикла одно за другим. Если у меня 10000 сущностей - этот процесс занимает много времени ... Мой вопрос - как я могу улучшить этот процесс создания, публикации и сохранения списка сущностей?

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

<dependency>
        <groupId>org.axonframework</groupId>
        <artifactId>axon-spring-boot-starter</artifactId>
        <version>4.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.axonframework</groupId>
                <artifactId>axon-server-connector</artifactId>
            </exclusion>
        </exclusions>
 </dependency>

Конфигурация SpringBoot с аннотацией @SpringBootApplication. Я не настраивал ничего особенного для Axon.


person Kseniia    schedule 06.05.2020    source источник
comment
Итак, прежде чем отвечать на ваш вопрос, мне нужно получить дополнительную информацию с вашей стороны: 1. Какую версию Axon вы используете? 2. Используете ли вы автоматическую настройку Spring Boot? 3. Настраивали ли вы что-нибудь особенное для Axon? Я предлагаю дополнить ваши вопросы ответами на них, чтобы они сразу были видны всем.   -  person Steven    schedule 07.05.2020
comment
Пользуюсь аксон-пружиной-ботинком-стартером 4.3. Конфигурация SpringBoot с аннотацией @SpringBootApplication. Я не настраивал ничего особенного для Axon.   -  person Kseniia    schedule 12.05.2020


Ответы (1)


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

  1. Меняем локальный CommandBus
  2. Распространение вашего приложения

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

Если у вас есть единственный экземпляр приложения Axon, использующий Spring Boot, SimpleCommandBus будет автоматически настроен для вас. Это не дает возможности для одновременной работы. Таким образом, нужно настроить другой CommandBus bean-компонент.

Я предлагаю сначала начать использовать AsynchronousCommandBus. В этой реализации используется Executor (который вы можете дополнительно настроить, если хотите), чтобы развернуть потоки для отправки (и обработки) каждой выполняемой команды.

Если вам все еще нужно медленно, я бы попробовал DisruptorCommandBus (чтобы узнать, что такое Disruptor, вы можете посмотреть здесь). Эта реализация CommandBus будет использовать два пула потоков; один пул для обработки команд и другой для хранения событий.

Наконец, если вы уже работаете с распределенной версией CommandBus (например, Axon Server или DistributedCommandBus), вам нужно будет предоставить компонент CommandBus с прикрепленным к нему квалификатором localSegment. Чтобы получить краткий обзор командных шин, предоставляемых Axon, я бы посмотрел там Справочное руководство (вверх здесь).

person Steven    schedule 13.05.2020