Что такое Project Reactor и для чего он используется в Java?

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

Ответ

Project Reactor — это библиотека для построения неблокирующих (non-blocking) реактивных приложений на JVM, реализующая спецификацию Reactive Streams. Она предоставляет абстракции для асинхронной обработки потоков данных с обратным давлением (backpressure).

Основные абстракции:

  • Mono<T> — представляет асинхронную операцию, которая выдаст 0 или 1 результат.
  • Flux<T> — представляет асинхронную последовательность, которая может выдать от 0 до N результатов.

Простой пример:

Flux<String> flux = Flux.just("Hello", "Reactive", "World")
    .delayElements(Duration.ofMillis(100)) // Неблокирующая задержка
    .map(String::toUpperCase)
    .filter(word -> word.length() > 5);

flux.subscribe(
    word -> System.out.println("Next: " + word), // onNext
    error -> System.err.println("Error: " + error), // onError
    () -> System.out.println("Completed!") // onComplete
);

Ключевые особенности и применение:

  • Неблокирующий ввод/вывод: Позволяет эффективно обслуживать тысячи одновременных соединений с малым числом потоков.
  • Обратное давление (Backpressure): Подписчик может контролировать скорость получения данных от издателя.
  • Функциональный API: Богатый набор операторов (map, filter, flatMap, zip, merge).
  • Ленивые вычисления: Выполнение начинается только после вызова subscribe().
  • Интеграция с экосистемой: Является основой для Spring WebFlux, реактивных драйверов БД (MongoDB, Cassandra) и клиентов (WebClient).

Типичные use-cases: высоконагруженные микросервисы, обработка потоков событий, реальные обновления данных.