Ответ
Работал с двумя основными реактивными библиотеками в 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
Ключевые преимущества использования:
- Композиция: Возможность строить сложные асинхронные цепочки из простых операторов (
map,filter,flatMap). - Эффективность: Неблокирующая модель позволяет обслуживать больше запросов с меньшим количеством потоков.
- Устойчивость: Легко добавлять таймауты, повторы и резервные схемы (fallback) с помощью операторов
timeout,retry,onErrorReturn.