Клиент Spring Reactive Web Framework

Я экспериментировал с реактивным веб-фреймворком и у меня есть определенный вопрос, как он будет работать.

В типичном приложении у нас есть хранилище данных (реляционное или без SQL). Уровень приложения (контроллеры) для подключения для хранения и получения данных. Клиентский уровень (вызывает ваши конечные точки API) и получить данные.

Насколько мне известно, поставщики не опубликовали никаких асинхронных или реактивных драйверов (только у Mongo и, возможно, у Cassandra есть реактивные драйверы). Уровень контроллера будет передавать данные с помощью Mono, Flux или Single.

Клиентский уровень будет использовать эти данные.

Поскольку HTTP является синхронным по своей природе, как клиентский уровень или приложение выиграют от реактивной поддержки в Spring.

Вопрос: Допустим, у меня есть 10 записей в формате JSON, полученных из моего ответа Flux. Означает ли это, что мой клиент получит данные в потоке или весь набор данных будет сначала получен на стороне клиента, а затем процесс его использования будет реактивным по своей природе . В настоящее время у нас есть InputStream как ответ на вызов службы, который по своей природе является блокирующим из-за конструкции протокола HTTP.

Вопрос: Имеет ли тогда смысл иметь реактивную архитектуру для типичного веб-приложения, когда очень среда, на которую мы собираемся получить ответ, - это Blocking in Nature.

Spring Web Reactive использует неблокирующий ввод-вывод Servlet 3.1 и работает в контейнерах Servlet 3.1. Он также работает в средах выполнения, отличных от сервлетов, таких как Netty и Undertow. Каждая среда выполнения адаптирована к набору общих реактивных абстракций ServerHttpRequest и ServerHttpResponse, которые представляют тело запроса и ответа как Flux с полной поддержкой обратного давления на стороне чтения и записи.

Источник: https://docs.spring.io/spring-framework/docs/5.0.0.M1/spring-framework-reference/html/web-reactive.html


person MrWayne    schedule 09.10.2017    source источник


Ответы (1)


Поставщики хранилищ данных и сообщества OSS работают над этим. В Spring Data Kay уже есть поддержка Cassandra, Couchbase, MongoDB и Redis.

Я думаю, вы объединяете сам протокол HTTP и блокируете API Java. Вы не получаете полный HTTP-запрос или ответ в одном большом блоке, поэтому HTTP-протокол не является синхронным. Базовая сетевая библиотека, которую вы выбираете, также определяет выбор между блокирующим или неблокирующим вводом-выводом.

Теперь о вашем вопросе HTTP-клиента: если вы используете WebClient, возвращенный Flux будет выдавать элементы, как только они станут доступны. Базовые библиотеки читают и декодируют сообщения как можно скорее, при этом соблюдая обратное давление.

Я не уверен, что получил ваш последний вопрос, но если вам интересно, когда и почему вам следует использовать реактивный подход: этот подход имеет преимущества, если вы уже сталкиваетесь с проблемами масштабируемости / эффективности или если ваше приложение взаимодействует с многие внешние службы и тогда чувствительны к задержкам. Подробнее об этом см. В FAQ по Spring Framework 5.0.

person Brian Clozel    schedule 13.10.2017