В реактивной цепочке WebFlux внутри map() выполняется синхронный JDBC-запрос. Чем это опасно?
- Можно ли использовать JDBC в WebFlux?
Потоков event loop — по числу ядер. Синхронный JDBC-запрос блокирует такой поток, и все соединения на нём ждут: несколько медленных запросов — и сервис стоит.
- Неблокирующие драйверы — R2DBC
- Если блокирующий вызов неизбежен — subscribeOn(Schedulers.boundedElastic())
- BlockHound находит блокировки в тестах
А ещё Или выбрать MVC с виртуальными потоками
Подробно
В этом принципиальная разница с моделью thread-per-request: там блокировка тормозит один запрос, здесь — целую группу. Несколько заблокированных потоков способны полностью остановить приложение под нагрузкой. Если блокирующий вызов неизбежен, его выносят на отдельный планировщик — subscribeOn(Schedulers.boundedElastic()), — но это лишь смягчение: вы возвращаетесь к модели с потоком на операцию и теряете значительную часть смысла реактивного стека. Правильнее использовать реактивный драйвер (R2DBC вместо JDBC) либо честно признать, что для этого сервиса подходит обычный MVC. Отлавливать такие места помогает BlockHound. Стоит помнить и общее правило: реактивный стек имеет смысл только целиком, одно блокирующее звено обесценивает всю цепочку.
Что хотят услышать
- Почему блокировка event loop опасна.
- R2DBC и boundedElastic.
- BlockHound — плюс.
Частые ошибки
- Считать boundedElastic полноценным решением, а не компромиссом.
- Смешивать блокирующий и реактивный стек в одном приложении без разделения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ничем: Reactor автоматически переносит блокирующие вызовы в отдельный пул boundedElastic
- ✓Блокируется один из немногих потоков event loop — падает пропускная способность
- ✗Запрос выполнится дважды из-за повторной подписки на цепочку внутри map()
- ✗Проблема проявится только при использовании WebClient
Что спросят дальше
- Что делает BlockHound?
- Как виртуальные потоки меняют выбор между MVC и WebFlux?
Разбор темы
- Reactive и Spring WebFlux
Неблокирующая модель и event loop, Reactive Streams и Reactor (Mono/Flux), backpressure, реактивный стек целиком, выбор MVC/WebFlux и цена сложности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.