Ответ
Message Broker (брокер сообщений) — это промежуточное программное обеспечение, которое обеспечивает асинхронный обмен сообщениями между различными компонентами распределенной системы (сервисами, приложениями, микросервисами).
Основная функция: Разделение отправителя (producer/publisher) и получателя (consumer/subscriber). Отправитель публикует сообщение в брокер и не знает, кто и когда его обработает.
Ключевые модели обмена:
- Очередь (Point-to-Point): Сообщение отправляется в очередь и доставляется одному из потребителей (конкурентных). Гарантирует, что сообщение будет обработано ровно один раз (в идеале).
- Топик/Обмен (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-брокеры.