使用httpcomponents-client-5.2.x遇响应少及DeadlineTimeoutException问题求助
HttpAsyncClient高吞吐量调用异常排查
环境与依赖
- 使用组件版本:Apache HttpComponents Client 5.2.3
- 依赖坐标:
org.apache.httpcomponents.client5:httpclient5:5.2.3 - Java环境:17.0.8(Red Hat OpenJDK,运行路径:
D:\unzipped\java-17-openjdk-17.0.8.0.7-1.win.x86_64)
测试场景
搭建小型Spring REST回声控制器,通过多线程并发发送请求,每个线程中连续两次请求间隔1毫秒。
异常现象
- 初始阶段响应量远低于请求量,核心统计示例如下:
Thu Mar 14 00:12:44 IST 2024 Stats-sent:10 Thu Mar 14 00:12:44 IST 2024 Stats-success:0 Thu Mar 14 00:12:44 IST 2024 Stats-failure:0 totalStats [leased: 0; pending: 0; available: 0; max: 5000] Number of routes [] Thu Mar 14 00:12:49 IST 2024 Stats-sent:8740 Thu Mar 14 00:12:49 IST 2024 Stats-success:192 Thu Mar 14 00:12:49 IST 2024 Stats-failure:0 totalStats [leased: 5; pending: 8517; available: 0; max: 5000] Number of routes [{}->http://172.18.17.74:8093] Thu Mar 14 00:12:54 IST 2024 Stats-sent:12818 Thu Mar 14 00:12:54 IST 2024 Stats-success:432 Thu Mar 14 00:12:54 IST 2024 Stats-failure:0 totalStats [leased: 5; pending: 12359; available: 0; max: 5000] Number of routes [{}->http://172.18.17.74:8093] Thu Mar 14 00:12:59 IST 2024 Stats-sent:15900 Thu Mar 14 00:12:59 IST 2024 Stats-success:660 Thu Mar 14 00:12:59 IST 2024 Stats-failure:0 totalStats [leased: 5; pending: 15204; available: 0; max: 5000]
- 运行一段时间后持续抛出超时异常:
DeadlineTimeoutException: Deadline: 2024-03-13T17:46:18.758+0000, -10847 MILLISECONDS overdue
选择5.2.3版本的原因是该版本已修复同类超时异常问题。
当前客户端配置代码
final int MAX_CONN_PER_ROUTE = Integer.getInteger("max.conn.per.route", 500); final int MAX_CONN_TOTAL = Integer.parseInt(System.getProperty("max.conn.total", "5000")); final Resolver<HttpRoute, ConnectionConfig> connectionConfigResolver = route -> { return ConnectionConfig.custom().setConnectTimeout(Timeout.ofSeconds(2 * 60)) .setSocketTimeout(Timeout.ofSeconds(2 * 60)).setValidateAfterInactivity(Timeout.ofSeconds(1)) .setTimeToLive( TimeValue.of(1, TimeUnit.MINUTES)).build(); }; final PoolingAsyncClientConnectionManager cm = PoolingAsyncClientConnectionManagerBuilder.create() .setConnectionConfigResolver(connectionConfigResolver) .setTlsConfigResolver(tlsConfigResolver) .setMaxConnPerRoute(MAX_CONN_PER_ROUTE) .setMaxConnTotal(MAX_CONN_TOTAL) .build(); cm.setDefaultMaxPerRoute(Integer.getInteger("client5.PoolingMaxConnectionSize", 5)); final HttpAsyncClientBuilder clientBuilder = HttpAsyncClients.custom().setConnectionManager(cm); final IOReactorConfig ioReactor = IOReactorConfig.DEFAULT; IOReactorConfig.Builder builder = IOReactorConfig.copy(ioReactor); final Integer count = Integer.getInteger("client5.IOThreadCount", Runtime.getRuntime().availableProcessors()); builder.setIoThreadCount(count); builder.setSelectInterval(TimeValue.of(2, TimeUnit.MILLISECONDS)); // builder.setSoReuseAddress(true); clientBuilder.setIOReactorConfig(builder.build()); CloseableHttpAsyncClient closeableHttpAsyncClient = clientBuilder.build(); closeableHttpAsyncClient.start();
核心诉求
排查当前配置或代码中的错误,定位导致请求积压、响应延迟及超时异常的原因。
内容的提问来源于stack exchange,提问作者lab bhattacharjee
相关产品推荐
相关产品推荐

