gpt4 book ai didi

java - 为什么 RestTemplate 并发调用时会挂起?

转载 作者:行者123 更新时间:2023-12-02 11:37:01 33 4
gpt4 key购买 nike

我有一个基于 Spring Boot 的应用程序,并使用 RestTemplate 发送 HTTP 请求。应用程序发送请求的某些端点响应速度非常慢,但有些端点应该响应很快。当使用 RestTemplate 的服务被大约 20 个线程并行使用时,RestTemplate 恰好会挂起并等待某些内容(某些对快速端点的请求执行速度比应有的速度慢得多)。当我切换到 Jersey HTTP 客户端时,问题消失了,所以它一定是 RestTemplate 本身的问题。

我使用 RestTemplateBuilder 创建 bean:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}

并使用exchange方法发送请求:

ResponseEntity<Void> result = restTemplate.exchange(url, HttpMethod.POST, request, Void.class);

有谁知道为什么 RestTemplate 可以这样做?

最佳答案

如果 Spring Boot 项目中有执行器依赖项,它会在内部使用 Micrometer 生成指标。

指标之一是http.client.requests,它跟踪 RestTemplate 处理的所有请求。在内部,Micrometer 创建一个 ConcurrentHashMap,它将每个端点作为键进行跟踪。例如,如果您有一个端点,请说

/api/user/{userId}

如果您使用不同的 userId 点击它 100 次,Micrometer 将在其映射中创建 100 个条目。对于较低环境来说这不是问题。但在 PROD 环境中可能会导致性能显着下降,其中数千个条目可能会堆积起来,并在 Major GC 启动之前减慢响应时间。

一种解决方案是通过在 application.properties 中包含以下属性来关闭此指标

management.metrics.enable.http.client.requests=false

关于java - 为什么 RestTemplate 并发调用时会挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48861134/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com