Что такое Push-модель в брокерах сообщений?

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

Ответ

Push-модель — это подход к доставке сообщений, при котором брокер активно отправляет (проталкивает) сообщения потребителю сразу при их появлении, без ожидания явного запроса.

Ключевые характеристики:

  • Низкая задержка: Сообщения доставляются мгновенно.
  • Пассивный потребитель: Клиенту не нужно постоянно опрашивать брокер.
  • Риск перегрузки: Потребитель может не успевать обрабатывать входящий поток.
  • Необходимость backpressure: Требуются механизмы контроля скорости (например, подтверждения, окна).
Сравнение с Pull-моделью: Аспект Push Pull
Инициатор доставки Брокер Потребитель
Задержка Низкая Зависит от частоты опроса
Нагрузка на клиент Низкая (нет опросов) Высокая (постоянные запросы)
Контроль скорости Сложный (нужен backpressure) Простой (клиент управляет)

Пример в Kafka (гибридный подход): Клиент использует poll(), но внутри брокер реализует семантику push для эффективной доставки батчей.

// Потребитель Kafka подписывается на топик и получает сообщения
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(List.of("my-topic"));

while (true) {
    // Метод poll() имитирует push, возвращая накопившиеся сообщения
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        processMessage(record.value());
    }
}

Типичные брокеры с Push-моделью: RabbitMQ (использует AMQP протокол с push), MQTT-брокеры.