Используйте хранилище событий с Axon Framework 3 и Spring Boot - PullRequest
0 голосов
/ 05 сентября 2018

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

Поскольку у меня не очень большой опыт работы со Spring, я не могу понять, как заставить его работать. У меня было бы два отдельных сервиса, один для командной стороны и один для стороны запроса. Поскольку я планирую иметь больше сервисов, я хотел бы знать, как настроить их для использования внешнего хранилища событий (не хранящегося ни в одном из этих сервисов).

Для распределения команд и событий я использую RabbitMQ:

@Bean
public org.springframework.amqp.core.Exchange exchange() {
    return ExchangeBuilder.fanoutExchange("AxonEvents").build();
}

@Bean
public Queue queue() {
    return QueueBuilder.durable("AxonEvents").build();
}

@Bean
public Binding binding() {
    return BindingBuilder.bind(queue()).to(exchange()).with("*").noargs();
}


@Autowired
public void configure(AmqpAdmin admin)
{
    admin.declareExchange(exchange());
    admin.declareQueue(queue());
    admin.declareBinding(binding());
}

Это создает требуемую очередь на локально работающем экземпляре RabbitMQ (с именем пользователя и паролем по умолчанию).

У меня вопрос: как настроить Axon для использования mysql в качестве хранилища событий?

1 Ответ

0 голосов
/ 05 сентября 2018

Поскольку в Справочном руководстве в настоящее время это не указано, я хочу указать это здесь. В настоящее время у вас есть примерно два подхода, которым вы руководствуетесь при распространении приложения Axon или разделении приложения Axon на (микро) сервисы:

  1. Используйте полностью открытый подход
  2. Использование AxonHub / AxonDb

Используя подход 2, который вы можете реализовать в среде разработчика, вам нужно будет только запустить AxonHub и AxonDb и настроить их для своего приложения. Вот и все, вы сделали; Вы можете масштабировать свое приложение, и все сообщения будут перенаправлены по желанию.

Однако, если вы хотите выбрать маршрут 1, вам придется предоставить несколько конфигураций

Во-первых, вы заявляете, что используете RabbitMQ для маршрутизации команд и событий. Фактически, платформа не просто позволяет использовать RabbitMQ для маршрутизации команд вообще. Обратите внимание, это решение для распространения EventMessages, но не CommandMessages. Я предлагаю использовать JGroups или Spring Cloud для маршрутизации ваших команд в сценарии с открытым исходным кодом (я добавил ссылки на страницы Справочного руководства, касающиеся распределения CommandBus для JGroups и Spring Облако).

Чтобы распространять ваши события, вы можете использовать три подхода:

  1. Используйте общую базу данных для ваших событий.
  2. Используйте AMQP для отправки ваших событий в разные экземпляры.
  3. Используйте Kafka , чтобы отправлять свои события в разные экземпляры.

Мои личные предпочтения при запуске приложения - начинать с одного монолита и отделять при необходимости. Я думаю, что термин «Evolutionary Micro Services» прекрасно это понимает.

Как бы то ни было, если вы используете парадигму обмена сообщениями, поддерживаемую Аксоном, во всей ее полноте, разделить сторону Команды со стороны Запроса после подопечных должно быть довольно просто. Если вы дополнительно используете AxonHub для распространения своих сообщений, то вы практически закончили.

В заключение я не нашел очень точного запроса по вашим вопросам. Дает ли это вам необходимую информацию для продолжения, @Federico Ponzi?

Обновление

Подумав, я думаю, ваше решение довольно простое. Вы используете Spring Boot и хотите настроить EventStore на использование MySQL. Чтобы Axon установил правильное значение EventStorageEngine (инфра-компонент, используемый под крышками для чтения / записи событий), вы можете просто добавить зависимость от spring-boot-starter-data-jpa. Аксон, его автоматическая конфигурация в этом сценарии автоматически заметит, что у вас есть Spring Data JPA на вашем пути к классам, и, таким образом, установит JpaEventStorageEngine.

...