Что такое Message Broker (брокер сообщений)?

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

Ответ

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

Основная функция: Разделение отправителя (producer/publisher) и получателя (consumer/subscriber). Отправитель публикует сообщение в брокер и не знает, кто и когда его обработает.

Ключевые модели обмена:

  1. Очередь (Point-to-Point): Сообщение отправляется в очередь и доставляется одному из потребителей (конкурентных). Гарантирует, что сообщение будет обработано ровно один раз (в идеале).
  2. Топик/Обмен (Publish-Subscribe): Сообщение публикуется в топик (topic) и доставляется всем подписчикам (subscribers) этого топика.

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

  • Слабая связанность: Сервисы не знают друг о друге.
  • Асинхронность: Отправитель не блокируется, ожидая обработки.
  • Буферизация и балансировка: Брокер сглаживает пиковые нагрузки.
  • Гарантированная доставка: Сообщения могут сохраняться на диске (persistent).
  • Маршрутизация и трансформация: Брокеры могут фильтровать и преобразовывать сообщения.

Пример работы с Apache Kafka (Java):

// PRODUCER отправляет сообщение в топик "orders"
Properties prodProps = new Properties();
prodProps.put("bootstrap.servers", "localhost:9092");
prodProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prodProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

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

// CONSUMER (в отдельном приложении) читает сообщения из топика "orders"
Properties consProps = new Properties();
consProps.put("bootstrap.servers", "localhost:9092");
consProps.put("group.id", "notification-service"); // Группа потребителей
consProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
consProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
consProps.put("auto.offset.reset", "earliest");

try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consProps)) {
    consumer.subscribe(List.of("orders"));
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        for (ConsumerRecord<String, String> record : records) {
            System.out.printf("Received order: key=%s, value=%s%n", 
                              record.key(), record.value());
            // Обработка сообщения...
        }
    }
}

Популярные реализации:

  • Apache Kafka: Высокая пропускная способность, долговременное хранение, потоковая обработка.
  • RabbitMQ: Гибкая маршрутизация (AMQP), поддержка различных протоколов.
  • Amazon SQS/SNS: Управляемые сервисы от AWS.
  • Apache ActiveMQ / Artemis: Классические JMS-брокеры.