ES访问TimeoutException分析

ES RestClient 底层是封装了HttpClient组件来是现实通过http方式访问远程ES服务,这个可以通过查看RestClient的 org.elasticsearch.client.RestClient#performRequestAsync() 这个方法得到验证,这个方法里有直接调用HttpClient的 org.apache.http.nio.client.HttpAsyncClient#execute() 这个方法。

由于Http协议底层是基于TCP协议来和对端网络建立连接,TCP协议建立网络连接需要经过三次握手,相对比较耗时,HttpClient为了提升性能,用连接池的方式对提交的连接请求进行管理,每次请求都从连接池里取连接,如果存在直接返回,如果不存在,放入队列等待。

通过查看代码TimeoutException是因为从连接池取连接超时,默认超时时间为无限时间。org.apache.http.client.config.RequestConfig.Builder#Builder可以在这里看到默认值。

原文地址:https://www.cnblogs.com/caiyao/p/13798534.html