Spring Data Elasticsearch ReactiveElasticsearchClient压测触发ReadTimeoutException咨询
异常触发原因
- 默认配置的
ReactiveElasticsearchClient读超时默认仅为5秒,本次压测并发数达500,且Elasticsearch、业务应用、JMeter三者共享同一台机器的CPU、内存、IO资源,资源争抢严重导致Elasticsearch写入响应速度大幅下降,超过默认读超时阈值触发异常。 - 底层Reactor Netty连接池默认配置过低:默认最大连接数为CPU核心数的2倍,常规4核CPU仅支持8个并发连接,500并发请求大量堆积在连接等待队列,等待+处理总时长超过超时阈值就会抛出超时。
- 压测请求携带
refresh=true参数,每次单条写入都强制Elasticsearch立即刷新分片生成段文件,这是非常重的IO操作,会进一步拖慢Elasticsearch的写入响应速度,放大超时问题。
必须对底层WebClient/HttpClient做额外配置
默认配置仅适合低并发的测试场景,高并发压测或生产环境需要调整超时、连接池参数,参考配置如下:
import java.time.Duration; import io.netty.channel.ChannelOption; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient; import org.springframework.data.elasticsearch.client.reactive.ReactiveRestClients; import org.springframework.data.elasticsearch.config.AbstractReactiveElasticsearchConfiguration; @Configuration public class ReactiveElasticsearchConfiguration extends AbstractReactiveElasticsearchConfiguration{ @Override @Bean public ReactiveElasticsearchClient reactiveElasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(getHostAndPort()) // 配置基础超时时间 .withConnectTimeout(Duration.ofSeconds(10)) .withSocketTimeout(Duration.ofSeconds(30)) // 调整底层Netty HttpClient的连接池、响应超时参数 .withHttpClientConfigurer(httpClient -> httpClient.tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) .responseTimeout(Duration.ofSeconds(30)) .pool(poolConfig -> // 最大连接数根据服务器CPU、IO性能调整,常规部署建议设为100~300 poolConfig.maxConnections(200) // 连接等待超时时间设为60秒,减少高并发下的获取连接失败 .pendingAcquireTimeout(Duration.ofSeconds(60)) ) ) ) .build(); return ReactiveRestClients.create(clientConfiguration); } }
额外优化建议
- 压测和生产环境都不要在单条写入请求中加
refresh=true参数,如有实时查询需求可调整Elasticsearch全局refresh_interval参数,或采用批量写入后统一刷新的策略,大幅降低IO开销。 - 不要将压测工具、业务服务、Elasticsearch部署在同一台机器做压测,资源争抢会导致压测结果完全失真,也极易触发各类超时异常。
- 可同步调整Elasticsearch写入侧参数:写入阶段关闭副本、调大translog刷盘间隔、适当增加索引分片数,进一步提升写入吞吐量。
内容的提问来源于stack exchange,提问作者safarione
相关产品推荐
相关产品推荐

