Spring MVC (async) против Spring WebFlux

Я пытаюсь понять Spring WebFlux. То, что я нашел до сих пор, является реактивным в ядре, ни сервлетом API, ни потоком за запрос, ни HTTP-потоком, ни сервером, ни приложением/потоком, ни json.

Но в чем разница между асинхронными вызовами в Spring MVC? Я имею в виду Spring MVC, когда вы возвращаете Future, DefferedResult и т.д. Вы получаете логику в обработчике запроса (метод контроллера), выполняемом в отдельном потоке, поэтому вы можете также использовать ресурсы пула потоков для отправки запросов на отправку.

Так что, пожалуйста, выделите различия, связанные с этим? Почему WebFlux здесь лучше?

Спасибо за ваше время!

Ответ 1

Асинхронная модель сервлета вводит границу асинхронности между потоками контейнера (1 запрос/модель сервлетов) и обработку запроса в вашем приложении. Обработка может произойти в другом потоке или ждать. В конце концов, вам нужно отправить обратно в контейнерный поток и прочитать/записать блокирующим способом (InputStream и OutputStream по сути блокируют API).

С этой моделью вам нужно много потоков для достижения параллелизма (потому что многие из них могут быть заблокированы в ожидании ввода-вывода). Это стоит ресурсов, и это может быть компромисс, в зависимости от вашего варианта использования.

С неблокирующим кодом вам нужно всего несколько потоков для обработки множества запросов одновременно. Это другая модель параллелизма; как и любая модель, есть преимущества и компромиссы с ней.

Для получения дополнительной информации об этом сравнении интерес к этому вопросу должен представлять разговор с сервлетами и реактивными столами.