Что такое Message Broker и для чего используются RabbitMQ и Kafka?

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

Ответ

Message Broker (брокер сообщений) — промежуточное ПО, обеспечивающее асинхронный обмен сообщениями между компонентами системы (производителями и потребителями). Он решает задачи декаплинга сервисов, буферизации нагрузки и надёжной доставки.

RabbitMQ vs Apache Kafka: сравнение и применение

Аспект RabbitMQ (AMQP) Apache Kafka
Модель Точка-точка (очереди), Pub/Sub (Exchange) Публикация/подписка на основе логов (log-based). Сообщения хранятся.
Главная цель Надёжная доставка, маршрутизация сообщений, RPC. Обработка потоков событий в реальном времени, хранение и воспроизведение данных.
Гарантии Подтверждения (ack), persistence, dead letter exchanges. Высокая пропускная способность, долговременное хранение, гарантия порядка в партиции.
Идеально для Фоновые задачи, распределение работы между воркерами, микросервисная коммуникация. Потоковая аналитика, event sourcing, сбор логов, мониторинг в реальном времени.

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

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
    // Объявляем очередь
    channel.queueDeclare("task_queue", true, false, false, null);
    // Публикуем сообщение
    String message = "New task #42";
    channel.basicPublish("", "task_queue", 
                         MessageProperties.PERSISTENT_TEXT_PLAIN,
                         message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");
}

Пример отправки события в Kafka (Java):

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");

try (Producer<String, String> producer = new KafkaProducer<>(props)) {
    // Отправка записи в топик
    ProducerRecord<String, String> record = 
        new ProducerRecord<>("user-events", "user123", "{"action":"login"}");
    producer.send(record);
    // send() асинхронный, можно добавить callback для обработки результата
}

Опыт применения: RabbitMQ — для фоновой обработки заказов и нотификаций; Kafka — для потоковой аналитики пользовательских действий и репликации данных между системами.