← Назад к вопросам

Что такое push-брокер?

2.0 Middle🔥 171 комментариев
#Брокеры сообщений

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Push-брокер (Message Broker)

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

Как работает push-брокер

в push-модели брокер сообщений:

// Пример push-брокера с RabbitMQ
public class PushBrokerExample {
    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        
        // Объявляем очередь
        channel.queueDeclare("task_queue", true, false, false, null);
        
        // Consumer-подписчик ЖДЁТ, пока брокер пушит ему сообщения
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody());
            System.out.println("Получено сообщение: " + message);
            // Подтверждаем обработку
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        };
        
        // Регистрируем слушателя - брокер СРАЗУ начнёт пушить сообщения
        channel.basicConsume("task_queue", false, deliverCallback, consumerTag -> {});
    }
}

Характеристики push-модели

Преимущества:

  • Минимальная задержка — сообщение доставляется мгновенно
  • Простота — подписчик просто подписывается и ждёт
  • Нет доп. опросов — экономим ресурсы

Недостатки:

  • Backpressure — если подписчик медленный, брокер может перегрузиться
  • Потеря контроля — сложнее управлять скоростью потребления

Pull vs Push

// PULL-модель (Kafka, потребитель инициирует запрос)
public class PullBrokerExample {
    public static void main(String[] args) {
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singleton("topic"));
        
        // Сами запрашиваем сообщения с интервалом
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        for (ConsumerRecord<String, String> record : records) {
            System.out.println(record.value());
        }
    }
}

// PUSH-модель (RabbitMQ, брокер отправляет сам)
public class PushBrokerPattern {
    public static void main(String[] args) throws Exception {
        Channel channel = connection.createChannel();
        // basicConsume регистрирует callback, брокер будет пушить
        channel.basicConsume("queue", true, (tag, delivery) -> {
            System.out.println("Получено: " + new String(delivery.getBody()));
        }, tag -> {});
    }
}

Примеры push-брокеров

  • RabbitMQ — классический push-брокер с поддержкой backpressure
  • Redis Streams — может работать в push-режиме через подписку
  • AWS SQS (long polling) — имитирует push за счёт long-polling запросов

Обработка backpressure

// Контролируем скорость доставки
channel.basicQos(10); // Брокер отправляет максимум 10 сообщений одновременно
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody());
    processMessage(message); // Долгая операция
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};

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