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

Чем Spring MVC отличается от Spring WebFlux?

SeniorReactive и WebFluxSpringWebFluxSpring Boot >=3.2
Ещё спрашивают так:
  • Когда выбирать WebFlux вместо Spring MVC?
Коротко

Spring MVC — сервлетная модель «поток на запрос», блокирующий код. WebFlux — неблокирующая модель на event loop (Netty) с Reactor: малое число потоков обслуживает много соединений, но весь путь обязан быть неблокирующим.

  • WebFlux выгоден при большом числе одновременных ожидающих соединений: шлюзы, стриминг, SSE
  • Блокирующий вызов (JDBC, RestTemplate) в WebFlux останавливает event loop
  • Java 21 и Boot 3.2: MVC на виртуальных потоках (spring.threads.virtual.enabled=true) масштабируется без реактивного кода

А ещё Для большинства CRUD-сервисов MVC проще и достаточен

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

Подробно

Spring MVC: запрос обрабатывает поток из пула Tomcat (по умолчанию 200). Пока код ждёт базу или внешний сервис, поток занят. Простой последовательный код и огромная экосистема (JPA, JDBC, большинство библиотек блокирующие). Предел — число потоков: при медленных зависимостях пул кончается.

Spring WebFlux: работает на Netty с несколькими потоками event loop по числу ядер. Обработчики возвращают Mono/Flux, вся цепочка неблокирующая: WebClient для HTTP, R2DBC для баз, реактивные драйверы. Плюсы — тысячи одновременных соединений при малом числе потоков, естественный стриминг и backpressure. Минусы — сложнее код, отладка, тесты; любой блокирующий вызов в цепочке (JDBC, block(), тяжёлые вычисления) замораживает event loop и все соединения на нём.

Виртуальные потоки (Java 21, Spring Boot 3.2+): spring.threads.virtual.enabled=true — Tomcat обрабатывает каждый запрос в виртуальном потоке. Код остаётся простым и блокирующим, а ожидание не держит поток ОС. Для многих сервисов это снимает главный аргумент в пользу WebFlux.

Выбор: обычный сервис с базой через JPA — MVC (с виртуальными потоками при большом числе ожиданий); API-шлюз, стриминг, SSE/WebSocket, агрегирование многих внешних вызовов — WebFlux; смешивать оба стека в одном приложении не стоит.

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

  • Модели потоков и их ограничения.
  • Требование неблокирующего пути в WebFlux.
  • Виртуальные потоки как альтернатива.
  • Критерии выбора.

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

  • Использовать JDBC или RestTemplate внутри WebFlux.
  • Переходить на WebFlux ради скорости обычного CRUD.

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

  • Что такое event loop?
  • Как работать с blocking кодом в WebFlux?

Разбор темы

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

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

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

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

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