Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 为什么Flux.range和Flux.range().flatmap(Flux.range())之间的性能存在差异?_Spring_Netty_Reactor_Spring Webclient - Fatal编程技术网

Spring 为什么Flux.range和Flux.range().flatmap(Flux.range())之间的性能存在差异?

Spring 为什么Flux.range和Flux.range().flatmap(Flux.range())之间的性能存在差异?,spring,netty,reactor,spring-webclient,Spring,Netty,Reactor,Spring Webclient,我使用基于netty的spring webclient来启动大量http请求,假设: total=page*cnt 这里的total是总请求 一个选项是使用通量范围(1,总计)作为: @RequestMapping(value = "/tid1", method = RequestMethod.GET) public Mono<String> total(@RequestParam(value = "total") Integer total) { l

我使用基于netty的spring webclient来启动大量http请求,假设:

total=page*cnt

这里的
total
是总请求

一个选项是使用通量范围(1,总计)作为:

    @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;
                })
                ;
    }
我发现这些选项之间的性能差别很大,第一个选项的QPS为12500,第二个选项的QPS为7000(QPS是一秒钟内处理的请求数)


不幸的是,我必须采用分页解决方案,我想知道为什么这两种方法有这么大的区别?

在第一个示例中,您似乎在map操作符而不是flatMap中启动http调用。由于代码的某些部分被遗漏,很难准确地说出发生了什么,但这似乎不正确,并且可能会对您的度量产生很大影响(如果没有订阅,这些调用甚至可能没有执行)。我的错,实际上这是平面图。我试图用另一个同步计算代码块替换webclient post以查看性能。那么total的值是多少?我们谈论的数字有多大?您呼叫的服务器是否可能因为呼叫数量而变慢?总数是一个像数百万这样的大数字。您是否在有“WebClient POST request here”的地方尝试了一次真正的网络呼叫,或者这些数字是在该块中使用一些计算工作得到的?在第一个示例中,您似乎在map操作符而不是flatMap中启动http调用。由于代码的某些部分被遗漏,很难准确地说出发生了什么,但这似乎不正确,并且可能会对您的度量产生很大影响(如果没有订阅,这些调用甚至可能没有执行)。我的错,实际上这是平面图。我试图用另一个同步计算代码块替换webclient post以查看性能。那么total的值是多少?我们谈论的数字有多大?您呼叫的服务器是否可能因为呼叫数量而变慢?总数是一个像数百万这样的大数字。您是否在有“WebClient POST request here”的地方尝试了一个真实的网络呼叫,或者是使用该块中的一些计算工作得出的数字?
    @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;
                })
        ;
    }