В чем ключевые различия между Apache Kafka, RabbitMQ и ActiveMQ Artemis?

«В чем ключевые различия между Apache Kafka, RabbitMQ и ActiveMQ Artemis?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это три популярных брокера сообщений с разными архитектурными парадигмами и сферами применения.

Характеристика Apache Kafka RabbitMQ ActiveMQ Artemis
Основная модель Поток событий (лог). Сообщения хранятся упорядоченно в топиках и могут перечитываться. Очереди сообщений (Message Queue). Сообщения доставляются потребителям и обычно удаляются после обработки. Универсальный брокер. Поддерживает как модели очередей (P2P), так и топиков (Pub/Sub) в стиле JMS.
Протоколы Собственный бинарный протокол поверх TCP. Клиенты для многих языков. В первую очередь AMQP 0-9-1 (и MQTT, STOMP). JMS 2.0 (родной), AMQP 1.0, MQTT, STOMP, OpenWire.
Стойкость сообщений Сообщения хранятся на диске длительно (по настройке retention). Сообщения хранятся в памяти или на диске до получения потребителем. Сообщения хранятся до доставки, поддерживается постоянное хранилище.
Производительность Очень высокая пропускная способность (миллионы сообщений/сек) за счет последовательной записи лога. Высокая, но обычно ниже, чем у Kafka, из-за сложной маршрутизации и гарантий доставки. Высокая, архитектура с асинхронным вводом-выводом.
Гарантии доставки At-least-once (как минимум раз) по умолчанию. Можно настроить exactly-once в рамках Kafka. Подробные гарантии: at-most-once, at-least-once. Поддержка транзакций (JMS XA), at-least-once, exactly-once.
Использование Стриминг данных, event sourcing, сбор логов, аналитика в реальном времени. Фоновая обработка задач, RPC, сложная маршрутизация между микросервисами. Enterprise-интеграция, системы, требующие строгой JMS-совместимости и транзакций.

Пример отправки сообщения:

  • Kafka (Producer API):
    producer.send(new ProducerRecord<>("orders-topic", orderId, orderEvent));
  • RabbitMQ (AMQP):
    channel.basicPublish("orders-exchange", "routing.key", null, messageBody);
  • Artemis (JMS):
    jmsContext.createProducer().send(queue, "Message");

Краткий выбор:

  • Kafka: Для потоков событий, где важны история, повторная обработка и высокая пропускная способность.
  • RabbitMQ: Для фоновых задач и коммуникации между сервисами с гибкой маршрутизацией.
  • Artemis: Для Java EE/Spring-приложений, требующих стандарта JMS, транзакций и высокой надежности.