Чем Spring MVC отличается от Spring WebFlux?
- Когда выбирать 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 проще и достаточен
Подробно
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.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗WebFlux всегда быстрее и подходит для любого CRUD-сервиса
- ✗MVC работает только на Tomcat, WebFlux — только на Jetty, иначе разницы между ними в модели обработки нет
- ✓MVC — поток на запрос и блокирующий код; WebFlux — event loop, весь путь неблокирующий
- ✗В WebFlux можно свободно вызывать JDBC
Что спросят дальше
- Что такое event loop?
- Как работать с blocking кодом в WebFlux?
Разбор темы
- Reactive и Spring WebFlux
Неблокирующая модель и event loop, Reactive Streams и Reactor (Mono/Flux), backpressure, реактивный стек целиком, выбор MVC/WebFlux и цена сложности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.