В чем разница между reactive stack на WebFlux и стандартным Hibernate
Что проверяют
Понимаете ли вы, что сравниваются вещи разного уровня: WebFlux это веб-стек, Hibernate это ORM поверх блокирующего JDBC. Настоящий вопрос звучит так: что будет, если соединить их в одном приложении. Следом обычно спрашивают про R2DBC, Hibernate Reactive и виртуальные потоки.
Как отвечать
Разведите модели выполнения:
- Spring MVC + Hibernate: поток на запрос. Поток контейнера ждёт, пока JDBC-драйвер вернёт ответ базы.
@Transactional, ленивая загрузка и сессия привязаны к потоку черезThreadLocal; - WebFlux: неблокирующий стек на Reactor, по умолчанию на Netty. Несколько потоков event loop, примерно по числу ядер, обслуживают тысячи соединений, код строится цепочками
MonoиFluxс backpressure; - конфликт: вызов JPA-репозитория внутри реактивной цепочки блокирует поток event loop, и пара медленных запросов к базе останавливает весь сервис. Такие места ловит BlockHound, а вынос на
Schedulers.boundedElastic()лишь прячет блокировку в отдельный пул; - реактивный доступ к данным: Spring Data R2DBC (не ORM: нет ленивой загрузки и маппинга связей) или Hibernate Reactive на драйверах Vert.x с API Mutiny или
CompletionStage, где ленивые ассоциации подгружают явно черезfetch; - транзакции: контекст едет в Reactor Context, а не в
ThreadLocal, поэтому нуженReactiveTransactionManagerилиTransactionalOperator.
Закончите выбором. С Java 21 виртуальные потоки (в Spring Boot 3.2+ свойство spring.threads.virtual.enabled=true) дают Spring MVC с JPA высокую конкурентность без переписывания кода. WebFlux оправдан, когда нужны стриминг, долгие соединения или весь путь до базы уже неблокирующий.
Где спотыкаются
Говорят, что Hibernate «выполняет все запросы в одном потоке». Блокируется тот поток, из которого пришёл вызов, а не какой-то общий.
Заворачивают JPA в Mono.fromCallable без смены планировщика и считают, что код стал реактивным.
Утверждают, что WebFlux всегда быстрее. Одиночный запрос он не ускоряет, выигрыш в числе одновременных соединений на том же железе, а платой идут сложная отладка и нечитаемые стек-трейсы.