Что такое Spring Reactive?

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

Ответ

Spring Reactive (Spring WebFlux) — это полностью асинхронный, неблокирующий, реактивный стек для построения веб-приложений в Spring, поддерживающий обратную нагрузку (backpressure).

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

  • Реактивное программирование: Работа с потоками данных (Publisher) через Mono (0-1 элемент) и Flux (0-N элементов) из Project Reactor.
  • Неблокирующий ввод-вывод: Позволяет обрабатывать больше одновременных запросов с небольшим фиксированным числом потоков, что эффективно для I/O-интенсивных задач.
  • Функциональная модель: Помимо аннотированных контроллеров, поддерживает функциональные эндпоинты через RouterFunction.
Сравнение с Spring MVC: Аспект Spring MVC (Императивный) Spring WebFlux (Реактивный)
Парадигма Блокирующая, thread-per-request Неблокирующая, event-loop
Контейнер Tomcat, Jetty (Servlet API) Netty, Servlet 3.1+
Лучше для Приложений с CPU-интенсивной логикой Высоконагруженных, потоковых или I/O-интенсивных приложений

Пример реактивного контроллера:

@RestController
@RequestMapping("/reactive/users")
public class ReactiveUserController {

    private final ReactiveUserService userService;

    @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<User> streamAllUsers() {
        return userService.findAllUsers(); // Возвращает Flux<User>
    }

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

Используйте WebFlux, когда нужна высокая конкурентность с малым числом потоков, но учитывайте сложность отладки и ограниченную поддержку блокирующих библиотек (например, JDBC).