JavaRush /Курсы /Модуль 5. Spring /Лекция 205: Инструменты для событийно-ориентированной арх...

Лекция 205: Инструменты для событийно-ориентированной архитектуры: Kafka, RabbitMQ, ActiveMQ

Модуль 5. Spring
21 уровень , 4 лекция
Открыта

Представьте, что вы организатор конференции и должны передать важное сообщение всем участникам. Конечно, вы можете подойти к каждому лично (как делают REST API в синхронной архитектуре), но это займет вечность. Вместо этого разумно использовать громкоговоритель (!) (брокер сообщений), чтобы разослать ваше сообщение единожды, а слушатели (подписчики) уже самостоятельно его услышат.

В мире EDA такого рода громкоговорителями служат брокеры сообщений. Их задача — передать событие от отправителя (producer) к получателям (consumers). При этом нужно обеспечить:

  • Надёжность доставки сообщений.
  • Масштабируемость и высокую производительность.
  • Асинхронную обработку сообщения.

На помощь нам приходят три популярные технологии: Apache Kafka, RabbitMQ и ActiveMQ.


Обзор Apache Kafka, RabbitMQ и ActiveMQ

Apache Kafka

Вы уже знаете, что Kafka — это ракетный двигатель мира брокеров сообщений. Напомним, это распределённая система, изначально разработанная в LinkedIn, а теперь её поддерживает Apache Software Foundation. Kafka была создана для обработки огромных объёмов данных в реальном времени с высокой пропускной способностью.

  • Основные преимущества Kafka:
    • Высокая производительность: миллионы сообщений в секунду.
    • Гарантированная доставка сообщений с помощью логов.
    • Поддержка горизонтального масштабирования.
    • Хорошая интеграция с Big Data экосистемой (Spark, Flink и др.).
  • Когда использовать Kafka:
    • Потоковая обработка данных (например, логирование или трекинг событий).
    • Аналитика в реальном времени.
    • Создание микросервисов, где требуется высокая производительность.
  • Недостатки:
    • Относительная сложность настройки и управления.
    • Требует хороших знаний архитектуры распределённых систем.

RabbitMQ

RabbitMQ — это классический кролик в мире брокеров сообщений. Это один из старейших брокеров сообщений, который использует протокол AMQP (Advanced Message Queuing Protocol). Он поддерживает более широкую функциональность для взаимодействия между приложениями.

  • Основные преимущества RabbitMQ:
    • Поддержка множества протоколов (AMQP, MQTT, HTTP, STOMP и др.).
    • Различные паттерны маршрутизации сообщений (очереди, широковещательная рассылка).
    • Гибкость в настройке и лёгкость интеграции.
  • Когда использовать RabbitMQ:
    • Если требуется гибкость в маршрутизации сообщений.
    • Для интеграции разнородных систем с использованием различных протоколов.
    • Когда система имеет небольшой объём и среднюю нагрузку.
  • Недостатки:
    • Не такая высокая производительность по сравнению с Kafka.
    • Ограничения по масштабированию.

ActiveMQ

ActiveMQ — это ветеран рынка брокеров сообщений, разработанный Apache Foundation. В отличие от Kafka, которая фокусируется на потоках данных, ActiveMQ больше подходит для классических сценариев обмена сообщениями в бизнес-приложениях.

  • Основные преимущества ActiveMQ:
    • Простота в использовании и конфигурации.
    • Поддержка транзакций и гарантированной доставки сообщений.
    • Хорошо подходит для небольших систем.
  • Когда использовать ActiveMQ:
    • В монолитных системах или небольших микросервисах.
    • Когда требуется поддержка транзакций и сохранение очередей.
  • Недостатки:
    • Производительность сильно уступает Kafka.
    • Меньше функциональных возможностей, чем у RabbitMQ.

Сравнение Kafka, RabbitMQ и ActiveMQ

Характеристика Apache Kafka RabbitMQ ActiveMQ
Протокол Собственный протокол AMQP JMS
Производительность Очень высокая Средняя Низкая
Масштабируемость Горизонтальное Вертикальное Ограниченное
Поддержка транзакций Нет (поддерживает "Exactly once") Да Да
Применение Потоковая обработка данных Интеграция систем Обмен бизнес-сообщениями
Кривая обучения Крутая Умеренная Низкая

Как выбирать инструмент для EDA?

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

  1. Каковы требования к производительности?
  2. Насколько сложные маршруты сообщений вам нужны?

Для потоковой обработки данных или анализа логов в реальном времени ваш выбор — Kafka.

Если нужен гибкий инструмент с различными паттернами взаимодействия, лучше взять RabbitMQ.

А если у вас простая система с небольшими очередями, то ActiveMQ станет отличным выбором.


Примеры использования инструментов

Пример 1: Apache Kafka

В интернет-магазине отслеживаются действия покупателей: добавление товаров в корзину, просмотр карточек товара. Эти действия записываются в Kafka-топик, после чего аналитические системы обрабатывают потоки данных для создания рекомендаций.


// Пример создания продюсера Kafka
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer7<String, String> producer = new KafkaProducer7<>(props);
producer.send(new ProducerRecord7<>("shopping-cart", "user123", "add_to_cart: product456"));
producer.close();

Пример 2: RabbitMQ

В CRM-системе заказы клиентов поступают в очередь RabbitMQ. Сервис обработки заказов (consumer) забирает сообщения из очереди для дальнейшей обработки.


ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
    channel.queueDeclare("orders_queue", false, false, false, null);
    String message = "New Order: 12345";
    channel.basicPublish("", "orders_queue", null, message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");
}

Пример 3: ActiveMQ

В банковской системе происходит обмен транзакциями с использованием ActiveMQ. Каждое сообщение содержит информацию о транзакции, которая затем сохраняется в базе данных.


ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
try (Connection connection = connectionFactory.createConnection()) {
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Queue queue = session.createQueue("transaction_queue");
    MessageProducer producer = session.createProducer(queue);
    TextMessage message = session.createTextMessage("Transaction: 100$ to Account 12345");
    producer.send(message);
    System.out.println("Sent: " + message.getText());
}

Подводные камни работы с брокерами сообщений

Работая с любым брокером, можно столкнуться с типичными проблемами. Например, при использовании Kafka нужно уделять внимание правильной конфигурации партиций, чтобы избежать перегрузки отдельных брокеров. RabbitMQ, в свою очередь, может потребовать глубокого анализа маршрутизации сообщений для сложных сценариев. А ActiveMQ может стать узким местом при высоких нагрузках.


Итог: что выбрать?

Ваш выбор брокера сообщений зависит от конкретной задачи и характеристик вашей системы. Kafka — это ваш выбор для большой, нагруженной системы потоковой обработки данных. RabbitMQ лучше подойдет для гибкой маршрутизации и интеграции, а ActiveMQ закроет потребности небольших систем с минимальными требованиями.

Не забывайте, что лучше протестировать несколько вариантов перед тем, как останавливать выбор на одном инструменте. И да, не забудьте регулярно чистить очереди сообщений, иначе эти "праздники жизни" закончатся быстрее, чем вы думаете.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ