Как увеличить пропускную способность WebFlux WebClient? - PullRequest
0 голосов
/ 08 октября 2018

Я хотел бы отправлять некоторые запросы и получать ответы с высокой частотой.

Мой код выглядит следующим образом:

  Flux.fromIterable(params)
            .delayElements(Duration.ofMillis(8))
            .subscribe(
              param -> {
                webClient
                    .get()
                    .uri(prefix.concat(Utils.urlEncoder(param)))
                    .header("K1", "V1"))
                    .exchange()
                    .subscribe(clientResponse -> {
                        log.info("");
                    });
            }
        );

Код работает хорошо, а частота хорошая. Но когдаЯ пытаюсь изменить значение метода delayElements (используйте Duration.ofMillis (4) ), я обнаружил некоторые исключения.

    ERROR [reactor-http-nio-2] ContextHandler --- Error cannot be forwarded to user-facing Mono
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.io.IOException: Connection closed prematurely
Caused by: java.io.IOException: Connection closed prematurely

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

После этого я уменьшил значение до Duration.ofMillis (0) . Код почти не может быть выполнен. Моя консоль полна исключений.

Caused by: java.net.SocketException: Too many open files in system

Могу ли я сделать пропускную способность кода лучше?

8 мс достаточно, но если я могу увеличить частоту, это замечательно!Спасибо!

Ответы [ 2 ]

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

В этом случае может произойти несколько вещей:

  • , если вы заполняете удаленный хост, этот хост может подумать, что вы пытаетесь выполнить DoS-атаку, и закроет входящие соединения
  • ваш локальный хост может исчерпать файловые дескрипторы, потому что вы создаете слишком много соединений

Как правило, вы должны использовать limitRate, чтобы ограничить количество одновременных вызовов.delayElements только вводит искусственную задержку, но не учитывает задержку в сети или замедление работы вашего сервера.

Вместо этого вы можете попробовать:

Flux.fromIterable(params)
    .limitRate(25)
    .flatMap(param -> webClient
                         .get()
                         .uri(prefix.concat(Utils.urlEncoder(param)))
                         .header("K1", "V1"))
                         .exchange()
    )
    .subscribe(clientResponse -> { log.info(""); }, error -> { log.error(e); });
0 голосов
/ 08 октября 2018

Когда вы получаете java.net.SocketException: Too many open files in system , это означает, что вы достигли ограничения на количество файловых дескрипторов.

Попробуйте:

https://unix.stackexchange.com/questions/84227/limits-on-the-number-of-file-descriptors

...