С какими реактивными библиотеками в Java вы работали?

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

Ответ

Работал с двумя основными реактивными библиотеками в Java: Project Reactor и RxJava.

Сравнение и применение:

Аспект Project Reactor RxJava
Основная абстракция Mono, Flux Observable, Flowable, Single
Интеграция с Spring Нативная (Spring WebFlux, Spring Data R2DBC) Требует адаптеров
Backpressure Встроенная поддержка в Flux Явно через Flowable

Пример Project Reactor (обработка с задержкой):

Flux.range(1, 5)
    .delayElements(Duration.ofMillis(200)) // Неблокирующая задержка
    .map(i -> i * 10)
    .doOnNext(System.out::println) // Побочный эффект для логирования
    .subscribe(); // Запуск потока
// Вывод: 10, 20, 30, 40, 50 (с паузами)

Пример RxJava (фильтрация и трансформация):

Flowable.fromIterable(Arrays.asList("Java", "Rx", "Reactor"))
    .filter(word -> word.length() > 2)
    .map(String::toUpperCase)
    .subscribe(
        System.out::println,  // onNext
        Throwable::printStackTrace, // onError
        () -> System.out.println("Done") // onComplete
    );
// Вывод: JAVA, REACTOR, Done

Ключевые преимущества использования:

  1. Композиция: Возможность строить сложные асинхронные цепочки из простых операторов (map, filter, flatMap).
  2. Эффективность: Неблокирующая модель позволяет обслуживать больше запросов с меньшим количеством потоков.
  3. Устойчивость: Легко добавлять таймауты, повторы и резервные схемы (fallback) с помощью операторов timeout, retry, onErrorReturn.