Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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
Java 如何提高单核cpu反应式编程的性能_Java_Performance_Spring Boot_Project Reactor_Reactor - Fatal编程技术网

Java 如何提高单核cpu反应式编程的性能

Java 如何提高单核cpu反应式编程的性能,java,performance,spring-boot,project-reactor,reactor,Java,Performance,Spring Boot,Project Reactor,Reactor,我有一个连接到第三方服务并将结果返回给客户端的应用程序。在内部,应用程序向第三方服务发出GET请求并获取结果。我已经使用Reactor和reactive代码在重负载下扩展应用程序。这是一个SpringBoot项目,它运行嵌入式Tomcat并依赖于Web客户端(被动netty向第三方发出请求)。不知何故,CPU利用率和响应时间都比阻塞模式差。硬件设置在Kubernetes中运行单个核心 该项目建立在Kubernetes内部,运行在单吊舱和一个核心上。我尝试了反应式的方式,但与阻塞式架构相比,应用程

我有一个连接到第三方服务并将结果返回给客户端的应用程序。在内部,应用程序向第三方服务发出GET请求并获取结果。我已经使用Reactor和reactive代码在重负载下扩展应用程序。这是一个SpringBoot项目,它运行嵌入式Tomcat并依赖于Web客户端(被动netty向第三方发出请求)。不知何故,CPU利用率和响应时间都比阻塞模式差。硬件设置在Kubernetes中运行单个核心

该项目建立在Kubernetes内部,运行在单吊舱和一个核心上。我尝试了反应式的方式,但与阻塞式架构相比,应用程序的速度要慢得多,甚至CPU利用率也很高

 public Mono<ResponseEntity<?>> get(HttpServletRequest request)
   {
      return Mono.create ( callback -> {
         Mono<Response> response = Make HTTP GET Call using webClient.
         response.subscribe(response -> {
         callback.success(response);
         },error -> {
         callback.error(error);
         }
       });
    }

<代码>公共单元格>我不明白为什么你订阅中间来提取响应。我认为订阅是一个昂贵的过程,应该只由呼叫客户完成一次

这是我将如何使用
doError
方法处理错误和映射响应的示例

public Mono<Foo> bar() {
    return client.get()
            .uri("/something")
            .accept(MediaType.APPLICATION_JSON)
            .exchange()
            .flatMap(response -> response.bodyToMono(Foo.class))

}

public Mono<Bar> foo() {
    return bar()
        .flatMap(stuff -> {
         return // Map it here to something else that 
                // is getting returned to the calling client
        })
        .doOnError(FooBarException::new);
公共单色条(){
返回client.get()
.uri(“/某物”)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response->response.bodyToMono(Foo.class))
}
公共Mono-foo(){
返回条()
.flatMap(内容->{
return//将它映射到其他
//正在返回到调用客户端
})
.doOnError(FooBarException::new);

在您的整个反应链中应该只有一个订阅。尽可能延迟它-在最后一个订阅。让我们重新编写您的代码:

public Mono<ResponseEntity<?>> get(HttpServletRequest request) {
      return Mono.just(requestObject)
                 .flatmap(a -> makeAsyncCall(a))
                 .doOnError(err -> doSomethingOnError());
}

内部订阅的原因是什么?订阅是一个昂贵的过程,只能由客户端执行一次。@ThomasAndolf我想获得Web客户端的结果,所以我要再次订阅。还有其他方法吗?谢谢Thomas提供的见解。你能告诉我为什么订阅是一个昂贵的过程吗?我不知道我真的不明白partMono.create应该是懒惰的,所以我不认为这意味着任何急切的订阅。但这肯定比你建议的代码要复杂得多。“在你订阅之前什么都不会发生”这意味着,即使链中存在错误,也会调用这段代码,即使链中更高的位置可能存在错误。正如所说,这段代码应该是惰性的,应该只在需要时进行调用。为了获得Web客户端的结果,我们需要正确订阅?有没有其他方法可以获得它?当我们谈论一些问题时nit:在大多数情况下,你希望一个反应式感知框架正在调用你的代码,并且很高兴得到一个Mono,它知道如何处理。subscribe返回一个一次性的,所以这个例子就是丢弃响应。你是对的。你可以在subscribe中丰富一个延迟结果,然后返回instread。我更新了我的答案以反映这一点。
Mono.just(request)
    .flatMap(request -> get(request))
    .subscribe(response -> setDeferredResult(response));

return deferredResult;