С какими брокерами сообщений (message queues) вы работали?

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

Ответ

Работал с несколькими популярными брокерами сообщений, каждый из которых решает разные задачи:

1. RabbitMQ (AMQP)

  • Модель: Классический брокер сообщений, реализующий протокол AMQP. Использует концепции exchanges (маршрутизаторы), queues и bindings.
  • Ключевые особенности: Гарантированная доставка (acknowledgments), поддержка различных паттернов маршрутизации (direct, fanout, topic, headers), гибкость.
  • Пример (Java с использованием AMQP):
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    try (Connection connection = factory.newConnection();
         Channel channel = connection.createChannel()) {
        // Объявляем очередь
        channel.queueDeclare("my_queue", false, false, false, null);
        // Публикуем сообщение в exchange по умолчанию ("") с routing key = имени очереди
        channel.basicPublish("", "my_queue", null, "Hello, RabbitMQ!".getBytes());
    }

2. Apache Kafka

  • Модель: Распределенная система потоковой передачи событий (event streaming platform), а не просто очередь. Сообщения хранятся в топиках (topics), разбитых на партиции, и сохраняются на диске.
  • Ключевые особенности: Высокая пропускная способность, отказоустойчивость за счет репликации, возможность повторного чтения сообщений (consumer groups), долговременное хранение.
  • Использование: Логирование, потоковая обработка данных (Kafka Streams), event sourcing.

3. Apache ActiveMQ / Artemis

  • Модель: Реализация JMS (Java Message Service) API. Поддерживает две модели доставки: очереди (Point-to-Point) и топики (Pub/Sub).
  • Ключевые особенности: Стандартный JMS API, встроенная в Java-экосистему, поддержка различных протоколов (OpenWire, AMQP, MQTT, STOMP).
  • Пример (JMS):
    ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    try (Connection connection = factory.createConnection()) {
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue("MY.QUEUE");
        MessageProducer producer = session.createProducer(queue);
        TextMessage message = session.createTextMessage("Hello, JMS!");
        producer.send(message);
    }

Сравнение и выбор:

  • RabbitMQ — для сложных маршрутизаций, RPC, фоновых задач, где важна гарантированная доставка и гибкость.
  • Kafka — для потоковой обработки больших объемов данных, логов, событий, где важны пропускная способность и возможность повторной обработки.
  • ActiveMQ/Artemis — для проектов, строго привязанных к стандарту JMS, или требующих поддержки множества протоколов.