Ответ
Message Broker (брокер сообщений) — это промежуточное программное обеспечение, которое обеспечивает асинхронный обмен сообщениями между компонентами распределенной системы (сервисами, приложениями).
Основные цели использования:
-
Развязка компонентов (Loose Coupling)
- Отправитель (producer) и получатель (consumer) не знают друг о друге. Они взаимодействуют только с брокером, что упрощает масштабирование и замену сервисов.
-
Буферизация и балансировка нагрузки
- Брокер действует как буфер, накапливая сообщения, если потребители не успевают их обрабатывать, сглаживая пиковые нагрузки.
-
Повышение надежности (Guaranteed Delivery)
- Поддержка подтверждений (acknowledgments), сохранение сообщений на диск и механизмы повторной доставки.
-
Гибкая маршрутизация сообщений
- Доставка по шаблонам (topic exchange в RabbitMQ), fanout (всем), или на основе правил.
Популярные паттерны:
- Очереди (Point-to-Point): Сообщение потребляется только одним из конкурирующих потребителей.
- Топики (Publish-Subscribe): Сообщение доставляется всем подписчикам топика.
Пример с RabbitMQ (Java Client):
// PRODUCER: Отправка сообщения в очередь
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 #123";
// Публикация сообщения с persistent флагом
channel.basicPublish("", "task_queue",
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
System.out.println(" [x] Sent: '" + message + "'");
}
// CONSUMER: Получение сообщений
DeliverCallback callback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received: '" + message + "'");
// Имитация обработки
try { Thread.sleep(1000); } catch (InterruptedException e) {}
// Подтверждение обработки (ACK)
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume("task_queue", false, callback, consumerTag -> {});
Выбор брокера:
- RabbitMQ (AMQP): Универсальный, гибкая маршрутизация, гарантированная доставка.
- Apache Kafka: Для потоковой обработки больших объемов данных, высокая пропускная способность, долговременное хранение.
- ActiveMQ / Artemis (JMS): Классический брокер для Java EE/Spring экосистемы.