Ответ
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-брокеры.