Есть ли опыт или знания по реактивному стеку?
Что проверяют
Есть ли за словами Reactor и WebFlux реальная практика и понимаете ли вы, какую задачу решает реактивный подход. Следом обычно спрашивают про backpressure, про блокирующие вызовы внутри цепочки и про то, как это тестировать.
Как отвечать
Если опыт есть, опишите проект: зачем выбрали реактивный стек, что было узким местом, какие показатели изменились по данным мониторинга. Если опыта нет, так и скажите и покажите, что понимаете основу. Каркас:
- спецификация: Reactive Streams, интерфейсы
Publisher,Subscriber,Subscription,Processor, в JDK они же есть какjava.util.concurrent.Flow. Backpressure строится наrequest(n): подписчик сам говорит, сколько элементов готов принять; - Project Reactor:
Monoдля нуля или одного значения,Fluxдля потока. Ничего не происходит доsubscribe(), цепочка это описание, а не вычисление; - стек Spring: WebFlux поверх Netty,
WebClientдля исходящих HTTP-запросов, R2DBC для реляционных баз, реактивные драйверы MongoDB и Redis; - RxJava 3:
Observableбез backpressure иFlowableс ним, плюсSingle,Maybe,Completable; - потоки выполнения:
publishOnиsubscribeOn, блокирующий код только наSchedulers.boundedElastic(); - тесты:
StepVerifierиз reactor-test, для поиска блокировок BlockHound.
Покажите, что понимаете цену. Реактивность не ускоряет отдельный запрос, она позволяет обслуживать много одновременных операций ввода-вывода малым числом потоков. Взамен вы получаете тяжёлые стектрейсы и контекст через Reactor Context вместо ThreadLocal. С Java 21 и виртуальными потоками многие I/O-сервисы проще писать в обычном блокирующем стиле, в Spring Boot это включается свойством spring.threads.virtual.enabled=true.
Где спотыкаются
Вызывают блокирующий JDBC или block() внутри цепочки на event loop. Несколько таких вызовов, и весь сервис встаёт.
Используют map там, где функция возвращает Mono: получается Mono<Mono<T>>, а внутренний вызов так и не выполняется, потому что на него никто не подписался. Нужен flatMap.
Обещают, что реактивность «ускорит всё». Так отвечает тот, кто не сравнивал её с обычным пулом потоков.