You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Spring Boot 2.0.1后出现HTTP请求异常挂起问题

Spring Boot 2.0.1升级后Apache Commons HttpClient经ELB请求挂起的排查与解决

刚升级到Spring Boot 2.0.1就碰到这种诡异的请求挂起问题,太闹心了对吧?结合你说的场景——App1通过AWS ELB调用App2,用的是自己封装的Apache Commons HttpClient,少量请求卡到15分钟才结束,我来给你捋捋最可能的根因和解决方向:

最可能的元凶:TCP连接复用与ELB超时不匹配

AWS ELB默认的空闲连接超时是60秒,如果你的HttpClient连接池配置里,连接的空闲存活时间超过这个值,ELB会悄悄断开这条连接,但客户端(App1的HttpClient)还会认为连接是可用的。下次复用这条“已死”的连接发请求时,就会陷入等待,直到TCP层的超时触发(通常就是十几分钟)。

对应的解决操作

  1. 调整HttpClient连接池的空闲超时,设置得比ELB的60秒短,比如50秒,同时开启连接有效性检查:
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
// 根据业务需求调整最大连接数
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(20);
// 关键:设置空闲连接校验时间,小于ELB超时
connectionManager.setValidateAfterInactivity(50000); // 单位:毫秒,即50秒

CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(connectionManager)
        .setDefaultRequestConfig(RequestConfig.custom()
                .setConnectTimeout(5000) // 连接建立超时5秒
                .setConnectionRequestTimeout(5000) // 从连接池获取连接的超时5秒
                .setSocketTimeout(30000) // 数据传输超时30秒,避免无限制等待
                .build())
        .build();
  1. 检查App2的Tomcat配置(Spring Boot 2.0.x默认Tomcat版本有更新),确保server.tomcat.keep-alive-timeout设置得比ELB超时短,避免App2先断开连接导致客户端挂起。可以在application.properties里加:
server.tomcat.keep-alive-timeout=55000 # 55秒
server.tomcat.max-keep-alive-requests=100

其他排查方向

  • 超时配置遗漏:确认你的HttpClient有没有完整设置三类超时——连接超时、连接池获取超时、Socket传输超时,升级后可能因为默认值变化导致某些超时未生效。
  • 抓包验证TCP状态:用tcpdump或Wireshark抓挂起请求的包,看是不是处于FIN_WAIT或CLOSE_WAIT状态,确认是连接层面的问题。
  • ELB健康检查:虽然你说只是少量请求,但也可以排查下ELB的健康检查配置,确保没有把不健康的App2实例留在转发池中。
  • HttpClient日志排查:开启HttpClient的DEBUG级别日志,查看挂起请求的连接获取、复用过程,定位是卡在连接池还是传输阶段。

内容的提问来源于stack exchange,提问作者Ken DeLong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:52:59