Какой опыт работы с реактивным программированием в Java?

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

Ответ

Работал с реактивным программированием в экосистеме Java, преимущественно с Project Reactor (как основа Spring WebFlux) и RxJava 2/3.

Ключевые концепции и опыт:

  • Основные абстракции: Работа с Mono (0-1 результат) и Flux (N результатов) в Reactor, Observable/Flowable/Single в RxJava.
  • Неблокирующие операции: Построение асинхронных цепочек вызовов для работы с БД (R2DBC), HTTP-клиентами (WebClient) и сообщениями (Kafka Reactor).
  • Контроль нагрузки (Backpressure): Использование стратегий like onBackpressureBuffer, onBackpressureDrop для управления потоком данных от быстрого продюсера к медленному консьюмеру.
  • Планировщики (Schedulers): Контроль над тем, в каком потоке выполняются операции (например, Schedulers.parallel(), Schedulers.boundedElastic()).

Пример реактивного REST-контроллера на Spring WebFlux:

@RestController
@RequiredArgsConstructor
public class UserController {
    private final ReactiveUserRepository userRepository;

    @GetMapping("/users")
    public Flux<User> getAllUsers() {
        return userRepository.findAll(); // Возвращает Flux<User> без блокировки
    }

    @GetMapping("/users/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userRepository.findById(id); // Возвращает Mono<User>
    }
}

Почему Reactor/RxJava? Они позволяют эффективно использовать ресурсы (меньшее количество потоков) для обработки большого количества одновременных соединений, что критично для высоконагруженных сервисов.