middle
Объясните разницу между Hot и Cold Observable
Cold Observable начинает эмитировать данные только после подписки; каждый подписчик получает полную последовательность с начала. Hot Observable эмитирует данные независимо от наличия подписчиков; новый подписчик получает только данные, отправленные после его подписки.
Cold Observable
Характеристики:
- Ленивое исполнение (Lazy Evaluation) — данные не производятся без подписчика
- Множественные подписки — каждый подписчик получает полную последовательность независимо
- Воспроизводимость — каждый подписчик видит одну и ту же последовательность с начала
Пример
Flux<String> coldFlux = Flux.just("A", "B", "C", "D")
.doOnSubscribe(s -> System.out.println("Subscribed to Cold Observable"));
coldFlux.subscribe(item -> System.out.println("Subscriber 1: " + item));
coldFlux.subscribe(item -> System.out.println("Subscriber 2: " + item));
// Оба подписчика получат A, B, C, D
Hot Observable
Характеристики:
- Жадное исполнение (Eager Evaluation) — публикация начинается сразу, даже без подписчиков
- Общий поток данных — все подписчики используют один источник
- Невоспроизводимость — подписчики видят разные части последовательности
Пример Hot Observable
import reactor.core.publisher.Flux;
import reactor.core.publisher.ConnectableFlux;
import java.time.Duration;
public class HotObservableExample {
public static void main(String[] args) throws InterruptedException {
ConnectableFlux<String> hotFlux = Flux.just("A", "B", "C", "D")
.delayElements(Duration.ofMillis(500))
.publish();
hotFlux.connect(); // Запускаем публикацию
hotFlux.subscribe(item -> System.out.println("Subscriber 1: " + item));
Thread.sleep(750);
// Второй подписчик пропустит первый элемент
hotFlux.subscribe(item -> System.out.println("Subscriber 2: " + item));
Thread.sleep(2000);
}
}
Ключевые отличия
| Критерий | Hot Observable | Cold Observable |
|---|---|---|
| Обмен данными | Один поток для всех подписчиков | У каждого подписчика свой поток |
| Время подписки | Данные зависят от момента подписки | Все данные доступны любому подписчику |
| Жизненный цикл | Работает независимо от подписок | Запускается только при подписке |
| Асинхронность | Генерирует данные без подписчиков | Передача начинается после подписки |
Практическое применение
Cold Observable:
- Чтение из файла, HTTP-запрос, генерация последовательности
- Сценарии, где каждый подписчик должен получить полные данные
Hot Observable:
- События мыши, обновления цен на акции, данные датчиков
- Сценарии, где важны только текущие и будущие события
На собеседовании: хороший маркер знаний — привести примеры из реальных проектов. Cold: HTTP-запрос (каждый subscribe делает новый запрос). Hot: WebSocket-соединение, Kafka-топик. Частая ошибка — не упомянуть ConnectableFlux как способ превращения Cold в Hot.