Как разработать реактивные микросервисы, у которых есть вызовы API внешней блокировки?

У меня есть несколько микросервисов, которые должны работать поверх фреймворка WebFlux. У каждого сервера есть собственный API с Mono или Flux. Мы используем MongoDB, который поддерживается Spring (Spring Data MongoDb Reactive).

Проблема заключается в API внешней блокировки, который я должен использовать в своей системе.

У меня есть одно решение. Я могу просто обернуть блокирующие вызовы API в выделенный пул потоков и использовать его с CompletableFuture.

Есть ли еще что-нибудь для решения моей проблемы? Думаю, что новенький Rsocket мою проблему не решит.


person Max    schedule 07.10.2018    source источник
comment
Под блокировкой API вы имеете в виду простой API типа HTTP-запрос-ответ? Реактивный HTTP-клиент существует для spring docs.spring.io/spring-framework/docs/5.0.0.M1/.   -  person David Szalai    schedule 08.10.2018
comment
@DavidSzalai да, я имею в виду простой API типа HTTP-запрос-ответ.   -  person Max    schedule 08.10.2018
comment
Я понимаю. Затем можно использовать реактивный веб-клиент, который я связал, если он использует неблокирующий ввод-вывод (вы должны проверить это, но я думаю, что это так). Выделенный пул потоков и обертка, блокирующая вызовы api с фьючерсами, не делают его неблокирующим, если вы думаете об этом. Он просто передает «блокирующую» часть другому пулу потоков. Проще говоря, вся цель неблокирования заключается в том, чтобы не ждать ответа, а получать уведомления, когда он приходит (например, в форме события), поэтому для этого требуется некоторая координация ОС на низком уровне.   -  person David Szalai    schedule 09.10.2018


Ответы (3)


1. Если возможно, вы можете изменить вызов API блокировки на реактивный, используя класс WebClient.

Использованная литература:

  1. Справочное руководство
  2. WebClient API
  3. Простой, полный пример

2. Если API блокировки не может быть изменен на реактивный, мы должны иметь выделенный, хорошо настроенный пул потоков и изолировать там блокирующий код. Здесь также есть пример здесь.

person chao_chang    schedule 09.10.2018

Я не понимаю, почему вы не можете заключить блокирующий вызов API в Flux или Mono. Вы также можете интегрировать Akka со Spring, если модель акторов кажется вам проще.

person Glenn    schedule 15.08.2020

RSocket должен идеально подойти, хорошие уроки для начала

https://www.baeldung.com/spring-boot-rsocket

https://spring.io/blog/2020/04/06/getting-started-with-rsocket-spring-boot-channels

person Yuri Schimke    schedule 15.12.2020