Основной вопрос: как Spring Reactors WebClient обеспечивает отсутствие блокировки по сравнению с RestTemplate? Разве ему не нужно где-то блокироваться после того, как он отправил запрос внешней службе (например)? HTTP по своей природе синхронен, верно? Значит, вызывающее приложение должно ждать ответа? Как поток узнает контекст, чтобы отреагировать на ответ службы?
Spring Reactor WebClient, как добиться неблокирования?
Ответы (1)
Здесь есть несколько отдельных вопросов.
- Как управляются операции ввода-вывода?
- Какая модель потоковой передачи стоит за этой средой выполнения?
- Как приложение работает с моделью запроса / ответа, лежащей в основе HTTP?
В случае WebClient
и проекта Reactor цикл событий Netty используется для постановки в очередь / отправки / обработки событий. Каждая операция чтения / записи выполняется неблокирующим образом, что означает, что ни один поток не находится в ожидании завершения операции ввода-вывода. В этой модели параллелизм не осуществляется через пулы потоков, но есть небольшое количество потоков, обрабатывающих единицу работы, которые никогда не должны блокироваться.
С точки зрения чистого HTTP (т.е. если вы перехватываете HTTP-пакеты в сети), вы не увидите большой разницы между вызовом RestTemplate
и WebClient
. Сам транспорт HTTP не поддерживает концепцию противодавления. Таким образом, клиенту по-прежнему приходится ждать ответа - разница в том, что приложение, использующее этот WebClient
, не будет тратить ресурсы на ожидание завершения этой операции - оно будет использовать их для обработки других событий.
Для получения дополнительной информации, пожалуйста, ознакомьтесь с введением в реактивное программирование в справочнике Reactor. документации и этот доклад Россена Стоянчева, который хорошо объясняет, если вы используется для типичной модели контейнера сервлетов.