Получить доступ

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

SeniorReactive и WebFluxWebFlux
Ещё спрашивают так:
  • Можно ли использовать JDBC в WebFlux?
Коротко

Потоков event loop — по числу ядер. Синхронный JDBC-запрос блокирует такой поток, и все соединения на нём ждут: несколько медленных запросов — и сервис стоит.

  • Неблокирующие драйверы — R2DBC
  • Если блокирующий вызов неизбежен — subscribeOn(Schedulers.boundedElastic())
  • BlockHound находит блокировки в тестах

А ещё Или выбрать MVC с виртуальными потоками

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

В этом принципиальная разница с моделью thread-per-request: там блокировка тормозит один запрос, здесь — целую группу. Несколько заблокированных потоков способны полностью остановить приложение под нагрузкой. Если блокирующий вызов неизбежен, его выносят на отдельный планировщик — subscribeOn(Schedulers.boundedElastic()), — но это лишь смягчение: вы возвращаетесь к модели с потоком на операцию и теряете значительную часть смысла реактивного стека. Правильнее использовать реактивный драйвер (R2DBC вместо JDBC) либо честно признать, что для этого сервиса подходит обычный MVC. Отлавливать такие места помогает BlockHound. Стоит помнить и общее правило: реактивный стек имеет смысл только целиком, одно блокирующее звено обесценивает всю цепочку.

Что хотят услышать

  • Почему блокировка event loop опасна.
  • R2DBC и boundedElastic.
  • BlockHound — плюс.

Частые ошибки

  • Считать boundedElastic полноценным решением, а не компромиссом.
  • Смешивать блокирующий и реактивный стек в одном приложении без разделения.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Блокируется поток event loop, которых всего несколько: пропускная способность всего приложения обрушивается
  • ✗Ничем: Reactor автоматически переносит блокирующие вызовы в отдельный пул
  • ✗Запрос выполнится дважды из-за повторной подписки
  • ✗Проблема проявится только при использовании WebClient

Что спросят дальше

  • Что делает BlockHound?
  • Как виртуальные потоки меняют выбор между MVC и WebFlux?

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем