Spring Reactor WebClient, как добиться неблокирования?

Основной вопрос: как Spring Reactors WebClient обеспечивает отсутствие блокировки по сравнению с RestTemplate? Разве ему не нужно где-то блокироваться после того, как он отправил запрос внешней службе (например)? HTTP по своей природе синхронен, верно? Значит, вызывающее приложение должно ждать ответа? Как поток узнает контекст, чтобы отреагировать на ответ службы?


person user1189332    schedule 15.08.2018    source источник
comment
Вы можете прочитать этот другой ответ.   -  person Edwin Dalorzo    schedule 15.08.2018


Ответы (1)


Здесь есть несколько отдельных вопросов.

  • Как управляются операции ввода-вывода?
  • Какая модель потоковой передачи стоит за этой средой выполнения?
  • Как приложение работает с моделью запроса / ответа, лежащей в основе HTTP?

В случае WebClient и проекта Reactor цикл событий Netty используется для постановки в очередь / отправки / обработки событий. Каждая операция чтения / записи выполняется неблокирующим образом, что означает, что ни один поток не находится в ожидании завершения операции ввода-вывода. В этой модели параллелизм не осуществляется через пулы потоков, но есть небольшое количество потоков, обрабатывающих единицу работы, которые никогда не должны блокироваться.

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

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

person Brian Clozel    schedule 17.08.2018
comment
С моим ограниченным пониманием Java NIO, правильно ли я (концептуально, а не строго технически) говорю, что будет открыт какой-то SocketChannel и зарегистрирован с помощью селектора, который затем будет управляться циклом событий, который бесконечно вращается, чтобы прослушивать селекторы для получения события из этих каналов, а затем реагируют (вызывает фактический код, ожидая ответа), когда канал генерирует событие? - person user1189332; 18.08.2018
comment
Мне кажется. Обратите внимание, что WebClient может поддерживать другие клиентские библиотеки http, поэтому модель времени выполнения может отличаться. - person Brian Clozel; 18.08.2018