Противодавление в пружине Webflux - PullRequest
0 голосов
/ 08 июля 2019

Я совершенно новичок в Spring Webflux и в целом к ​​реактивной идее в целом.У меня есть несколько вопросов о том, как Spring Webflux обрабатывает запросы на основе своих реактивных издателей (Flux / Mono).Возьмем, к примеру, простой контроллер:

@PostMapping("/planets")
public Mono<Void> createNewPlanets(Flux<Planet> planetFlux) {

    return planetService
                       .insert(planetFlux.limitRate(10))
                       .then();
}

Я понимаю, что limitRate () действует как ограничитель для последующих запросов.Мои вопросы, этот механизм противодавления действует только на основе отдельных запросов моего параметра (planetFlux).В любом случае WebFlux (или реактивное программирование) решает проблему большого количества запросов?То есть, как мне оптимизировать приведенный выше код для нескольких одновременных запросов?

Мой второй вопрос - где именно хранятся остальные элементы planetFlux, если предположить, что я применяю какой-то механизм противодавления?Возьмем приведенный выше код еще раз, если у меня 100 элементов в planetFlux, где остальные 90 хранятся, когда мой нисходящий поток обрабатывает его?Хранится ли он в очереди?

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

1 Ответ

0 голосов
/ 09 июля 2019

В любом случае WebFlux (или реактивное программирование) решает проблему большой нагрузки запросов? То есть, как мне оптимизировать приведенный выше код для нескольких одновременных запросов

Webflux спроектирован по своей сути для больших нагрузок запросов, отойдя от идеи «один поток на запрос» вместо того, чтобы вместо этого реализовать цепочки, основанные на событиях, где потоки работают только во время генерируемых событий.

Как указано в документации:

Существует два основных способа улучшить производительность программы:

  • распараллеливание: используйте больше потоков и больше аппаратных ресурсов.

  • стремиться повысить эффективность использования текущих ресурсов.

И реактивная программа пытается выполнить вторую точку пули.

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

Кто-то подписывается на ваш сервис и публикует кучу планет. Вы берете это и ограничиваете скорость вставки до 10, чтобы метод вставки получал Flux, который будет испускать партии по 10, чтобы вставить то, что вы вставляете тоже. Так что я не совсем понимаю ваш вопрос здесь.

ваш второй вопрос:

где именно хранятся остальные элементы planetFlux

Если вы посмотрите в исходном коде, вы увидите следующее.

В потоке отдельный элемент сохраняется в классе FluxJust<T>.class как прямое значение. в то время как несколько значений хранятся в FluxArray<T>.class в виде простого и простого массива.

...