Я использую весенний веб-клиент на основе netty для инициирования массивных HTTP-запросов, предполагая:
total = page * cnt
здесь total
- общий запрос.
Один из вариантов - использовать Flux.range(1, total)
как:
@RequestMapping(value = "/tid1", method = RequestMethod.GET)
public Mono<String> total(@RequestParam(value = "total") Integer total) {
long ms = System.currentTimeMillis();
return Flux.range(1, total)
.flatmap(n -> {
// WebClient POST request here
})
.then(Mono.just(total))
.map(n -> {
long ms1 = System.currentTimeMillis();
long du = n * 1000 / (ms1-ms);
String res = "Num: " + n + ", QPS: " + du;
log.error(res);
return res;
})
;
}
Другой вариант - разбить total
на page
страницы, каждая страница принимает cnt
запросов:
@RequestMapping(value = "/tid", method = RequestMethod.GET)
public Mono<String> paging(@RequestParam(value = "page") Integer page, @RequestParam(value = "cnt") Integer cnt) {
long ms = System.currentTimeMillis();
return Flux.range(1, page)
.flatMap(n -> {
return Flux.range(1, cnt)
.flatMap(k -> {
// WebClient POST request here
});
})
.then(Mono.just(cnt * page))
.map(n -> {
long ms1 = System.currentTimeMillis();
long du = n * 1000 / (ms1-ms);
String res = "Num: " + n + ", QPS: " + du;
log.error(res);
return res;
})
;
}
I обнаружил, что производительность между этими вариантами сильно различается, первый имеет 12500 QPS, а второй 7000 QPS (QPS - это количество запросов, обработанных за одну секунду).
К сожалению, я должен использовать пейджинг решение, и мне интересно, почему эти два подхода так сильно различаются?