Что такое реактивное программирование и его применение в Java?

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

Ответ

Реактивное программирование — это парадигма, ориентированная на асинхронную обработку потоков данных с неблокирующим backpressure (контролем надгрузки).

В Java это реализуется через библиотеки Project Reactor (основа Spring WebFlux) и RxJava, использующие типы Mono (0-1 результат) и Flux (0-N результатов).

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

@RestController
public class UserController {
    @GetMapping("/users")
    public Flux<User> getAllUsers() {
        // Реактивный репозиторий возвращает Flux, не блокируя поток
        return userRepository.findAll();
    }

    @GetMapping("/users/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userRepository.findById(id);
    }
}

Преимущества:

  • Эффективность ресурсов: Меньшее количество потоков для обработки множества одновременных соединений (например, через Netty).
  • Backpressure: Подписчик может контролировать скорость генерации данных издателем.
  • Функциональный стиль: Цепочки операторов (map, filter, flatMap, zip).

Типичные сценарии использования:

  1. Высоконагруженные или потоковые API.
  2. Микросервисы с асинхронной коммуникацией.
  3. Обработка событий в реальном времени (чаты, уведомления).

Сложности:

  • Отладка асинхронных цепочек.
  • Необходимость полностью неблокирующего стека (от БД до клиента).
  • Более крутая кривая обучения.