Вопрос с собеседования · Spring

В реактивной цепочке WebFlux внутри map() выполняется синхронный JDBC-запрос. Чем это опасно?

SeniorReactive и WebFluxWebFlux
Ещё спрашивают так:
  • Можно ли использовать 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?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования