Что такое реактивный фреймворк и как он работает
Что проверяют
Отличаете ли вы реактивный стек от «просто асинхронного кода». Вопрос задают там, где в проекте уже есть WebFlux или Reactor: нужен человек, который понимает, зачем платить сложностью, и не заблокирует event loop на первой неделе.
Как отвечать
Реактивный фреймворк это реализация спецификации Reactive Streams: асинхронный поток элементов с неблокирующим обратным давлением. Четыре интерфейса: Publisher, Subscriber, Subscription, Processor. Ключевое тут backpressure: подписчик сам запрашивает столько элементов, сколько готов обработать, и быстрый источник не заваливает медленного потребителя.
В Java это Project Reactor (типы Mono и Flux, основа Spring WebFlux) и RxJava. Под ними неблокирующий транспорт, обычно Netty: небольшой пул потоков обслуживает тысячи соединений, поток не простаивает на сокете.
Mono<User> user = repo.findById(id);
Flux<Order> orders = user.flatMapMany(u -> orderRepo.findByUser(u.getId()));
return orders.take(100).collectList();Цепочка ленивая: до подписки не выполняется ничего, подписывается контейнер, когда приходит запрос.
Обязательно скажите про цену. Выигрыш есть на нагрузке, упирающейся в ввод-вывод при большом числе одновременных соединений; на счётных задачах реактивность не даёт ничего. Нужен неблокирующий драйвер базы (R2DBC), стектрейсы рвутся, отладка тяжелее. В современных версиях Java часть этих задач закрывают виртуальные потоки, оставляя привычный блокирующий стиль.
Где спотыкаются
Называют реактивность способом ускорить отдельный запрос. Задержка одного вызова не падает, растёт пропускная способность при ограниченном числе потоков и предсказуемость под пиками.
Забывают про backpressure и сводят ответ к «подписался на события». Без запроса нужного количества элементов это обычный колбэк-стиль, а очередь копится в памяти до отказа.
Ставят блокирующий вызов внутрь цепочки на event loop: JDBC, Thread.sleep, обращение к внешнему сервису блокирующим клиентом. Падает не один запрос, а весь сервис. Если блокирующего кода не избежать, его выносят на отдельный планировщик.