В чем ключевые архитектурные различия между Apache Kafka и RabbitMQ?

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

Ответ

Kafka и RabbitMQ — это популярные брокеры сообщений, но с фундаментально разными архитектурами и паттернами использования.

Apache Kafka

  • Модель: Распределённый лог-ориентированный (log-centric) брокер.
  • Назначение: Обработка высокоскоростных потоков данных (streaming), событийный механизм, сбор логов.
  • Гарантии доставки: "At least once" по умолчанию, настраивается до "exactly once".
  • Хранение: Сообщения хранятся долго (дни, недели) на диске в упорядоченных, неизменяемых логах (топиках с партициями).
  • Потребление: Потребители управляют своим смещением (offset) и могут перечитывать старые сообщения.

Пример Producer на Java:

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-broker:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.ACKS_CONFIG, "all"); // Высокая надёжность

KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("orders", "order-123", "{...}");
producer.send(record); // Асинхронная отправка
producer.close();

RabbitMQ

  • Модель: Умный брокер / очереди сообщений на основе AMQP.
  • Назначение: Точечная доставка задач, RPC, сложная маршрутизация, фоновые задания.
  • Гарантии доставки: Подтверждения (ACK), транзакции, "exactly once" с помощью подтверждений издателя (publisher confirms).
  • Хранение: Сообщения хранятся в памяти или на диске до момента обработки потребителем, затем обычно удаляются.
  • Потребление: Сообщение удаляется из очереди после подтверждения (ACK) потребителем.

Пример отправки в RabbitMQ (Spring AMQP):

@Autowired
private AmqpTemplate amqpTemplate;

public void sendOrder(Order order) {
    // Отправка в exchange "orders" с routing key "new"
    amqpTemplate.convertAndSend("orders", "new", order, message -> {
        message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
        return message;
    });
}

Сравнительная таблица

Параметр Apache Kafka RabbitMQ
Архитектура Распределённый лог (партиции, реплики) Централизованный брокер (очереди, exchange)
Протокол Собственный (над TCP), есть клиенты для многих языков AMQP 0.9.1 (стандарт), также MQTT, STOMP
Маршрутизация По партициям топика (ключ сообщения) Гибкая (direct, topic, fanout, headers exchange)
Скорость Очень высокая (миллионы сообщений/сек) за счёт пакетной обработки и логов Высокая, но обычно ниже Kafka для потоков
Задержка Низкая (миллисекунды) Очень низкая (микросекунды) для одиночных сообщений
Масштабирование Горизонтальное (добавление брокеров и партиций) Вертикальное и кластеризация (очереди на узлах)
Идеальный сценарий Потоковая обработка, аналитика в реальном времени, событийные шины Фоновые задачи, надежная доставка, сложная маршрутизация

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