Ответ
Реактивное программирование — это парадигма, ориентированная на асинхронную обработку потоков данных с неблокирующим 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).
Типичные сценарии использования:
- Высоконагруженные или потоковые API.
- Микросервисы с асинхронной коммуникацией.
- Обработка событий в реальном времени (чаты, уведомления).
Сложности:
- Отладка асинхронных цепочек.
- Необходимость полностью неблокирующего стека (от БД до клиента).
- Более крутая кривая обучения.