Gymterview
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.