Насколько эффективно переопределить исполнителя Threadpool по умолчанию для проекта Spring webflux? - PullRequest
0 голосов
/ 17 мая 2019

Я новичок в Spring-Webflux.

Я запускаю приведенный ниже пример проекта на 2-ядерном процессоре.Мой API RESTful будет вызывать внешний API, и ответ внешнего API будет менее 500 мс.

Когда я использую jMeter для нагрузочного тестирования, я не могу достичь более 15 TPS.

Am iчто-то упущено или что-то не так с приведенным ниже дизайном?

Насколько эффективно переопределить исполнителя Threadpool по умолчанию в проекте Webflux?

Заранее спасибо.

Controller.java
----------------

LookupController
{

@ Autowired
частный LookupService lookupService;
@PostMapping (value = "/ findOrder")
public Mono> findOrder (@RequestBody InputBean inputBean) {

return lookupService.findOrder (inputBean)
.map (соответственно -> ResponseEntity.ok (респ))
.defaultIfEmpty (ResponseEntity.notFound (). build ());
}
}

Служба
---------

@ Service
открытый класс LookupService
{
private RestWorker restWorker;
public Mono findOrder (InputBean inputBean)
{
..// Базовая проверка
ApiBean apiBean = restWorker.buildApiBean (inputBean);
Mono responseStr = restWorker.callApi (apiBean);
возвращать responseStr.flatMap (-> {
// Business Logic
// Обработка ответа API и создание соответствующего ответа контроллера
return Mono.just (controllerResponse);
});
}

}

Помощник
---------

@ Component
public RestWorker {

private Webclient webClient = null;

@ PostConstruct
private void initWorker () {
webClient = WebClient.builder ()
.baseUrl (httpUrl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, "application / json")
.defaultHeader (HttpHeaders.ACCEPT, "application / json")
.defaultHeader (HttpHeaders.ACCEPT_CHARSET, "UTF-8")
bu (10) *.;
}

public ApiBean buildApiBean (InputBean inputBean) {
// Создать ApiBean на основе входного bean + config values
....
return apiBean;
}

public Mono callApi (ApiBean apiBean) {
Mono responseMonoStr = null;
try {
responseMonoStr = webClient.post ()
.uri (url_tibco)

.body (BodyInserters.fromObject (reqDoc))

.exchange ()

.timeout(Duration.ofMillis (socketReadTimeout))
.flatMap (clientResponse -> {

System.out.println (Thread.currentThread (). GetName () + "Код состояния:" + clientResponse.statusCode ());
return clientResponse.bodyToMono (String.class);

});
} catch (исключение исключения) {
return Mono.just ("");
}

}

}

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Брайан Клозел,

Большое спасибо. Неблокирующий API работает на основе цикла событий с небольшим количеством потоков. Но, когда я посылаю несколько параллельных запросов, он открывает 2 разных потока, таких как реактор-http-nio-2, реактор-http-nio-3 ..

Почему он открывает разные потоки при каждом параллельном запросе?

0 голосов
/ 20 мая 2019

Это не так, поскольку Spring WebFlux не использует исполнителя Threadpool для отправки веб-запросов.Он скорее использует другие ресурсы сервера, такие как циклы событий (для Netty).Для получения дополнительной информации об этом вы можете проверить справочную документацию Spring Boot по реактивным ресурсам сервера и, что более важно, узнать о модели параллелизма в Spring WebFlux .

...