Блокировка операций ввода-вывода с помощью WebFlux - PullRequest
0 голосов
/ 23 октября 2018

У нас есть поток, который мы хотели бы реализовать с помощью реактивного программирования с использованием Spring Boot 2 WebFlux.В настоящее время у нас нет опыта с реактивным программированием.
В рамках этого потока мы собираемся создать на или более HTTP-запросов (я полагаю, используя WebClient), а также читать некоторые данные из БД.
Мы планируем использовать AWS DynamoDB, но, насколько я понимаю, Java SDK не поддерживает реактивный API.
Это чтение будет блокирующей операцией ввода-вывода, мой вопрос заключается в том, есть ли преимущество в реализации части этого потока с помощью WebFlux?В более общем смысле, исключает ли единственная блокирующая операция ввода-вывода в потоке все преимущества, которые мы получаем от реализации с помощью реактивного программирования?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Исходя из вашего вопроса, реактивный - это простой способ справиться с операцией блокировки, особенно IO (сеть, файл и т. Д.)

, вы можете использовать библиотеку , которая реализует этот APIреактивным способом или завершение запроса на блокировку с реактивным API, обычно это делается размещением блокирующего оператора в пуле потоков пыльников

в весеннем webflux-е, вы можете достичь чего-то похожего на

@GetMapping
public Mono<Response> getResponse() {
  return Mono.fromCallable(() -> blockingOp())
    .publishOn(Schedulers.elastic());        
}

publishOn в этом случае вызовет весь этот поток в другом потоке, вы можете выбрать выделенный пул потоков в качестве

из документов , elastic - это планировщик

, который динамически создает рабочих на основе ExecutorService и кэширует пулы потоков, повторно используя их после закрытия рабочих.

0 голосов
/ 25 октября 2018

Следующее может не полностью ответить на ваш вопрос, но может быть немного полезно.Существует вопрос, упомянутый в FAQ для Spring Framework 5, а именно:

Что, если для моей базы данных нет реактивной библиотеки?

Ответ на этот вопрос таков:

Одним из предложений по обработке сочетания блокирующего и неблокирующего кода было бы использование мощности границы микросервиса для отделения блокирующего кода хранилища данных бэкенда от неблокирование интерфейсного API.В качестве альтернативы вы также можете использовать пул рабочих потоков для блокирования операций, сохраняя таким образом цикл основного события неблокирующим.это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...