java - 如何提高单核CPU响应式(Reactive)编程的性能

标签 java performance spring-boot project-reactor reactor

我有一个连接到第三方服务并将结果返回给客户端的应用程序。在内部,应用程序向第三方服务发出 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/

相关文章:

java - 为什么 JUnit 5 默认访问修饰符更改为 package-private

java - 使用 ArrayList 循环

java - 如何使用java和jsoup从页面源获取数据

java - 将 ADT bundle 从一台 ubuntu 计算机复制到另一台 eclipse 后无法打开

mysql - 在 Mysql 查询中引用整数的缺点?

mysql按距离搜索顺序很慢

C++将子字符串解析为整数

mongodb - 尝试从 spring boot docker 容器连接到 mongo docker 容器时验证 MongoCredential 时出错?

maven - Intellij : web app is fine at work but stops working at home (via VPN)

java - Spring Boot 单元测试模块未检测到 Autowiring 的组件