我有一个连接到第三方服务并将结果返回给客户端的应用程序。在内部,应用程序向第三方服务发出 GET 请求并获取结果。我使用 Reactor 和响应式(Reactive)代码在重负载下扩展应用程序。这是一个 Spring Boot 项目,运行嵌入式 Tomcat 并依赖 Web 客户端(用于向第三方发出请求的 Reactive netty)。不知何故,CPU 利用率和响应时间比阻塞模式更差。硬件设置在 Kubernetes 中运行单个核心。
该项目设置在 Kubernetes 内部,并在一个核心的单个 pod 上运行。我尝试了响应式(Reactive)方式,但与阻塞架构相比,应用程序速度慢得多,甚至 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);
}
});
}
使用传统阻塞模式,与响应式(Reactive)方法相比,我能够看到更好的性能和更低的 CPU 使用率。造成这种差异的原因可能是什么?是因为只有一个核心而导致上下文切换吗?如果是,我们如何通过单核架构获得更好的性能?
最佳答案
我真的不明白为什么你要在中间订阅来提取响应。我认为订阅是一个昂贵的过程,并且只能由调用客户端完成一次。
这是我如何使用 doOnError
方法处理错误并映射响应的示例。
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);
关于java - 如何提高单核CPU响应式(Reactive)编程的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56722418/