Axon framework - хранение списка событий - PullRequest
0 голосов
/ 06 мая 2020

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

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

    }

В результате события создаются, публикуются и сохраняются в таблице DomainEventEntry внутри l oop одно за другим. Если у меня 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. Я не настраивал ничего c для Axon.

1 Ответ

0 голосов
/ 13 мая 2020

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

  1. Изменить локальное CommandBus
  2. Распределить ваше приложение

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

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

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

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

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

...