Java 即使在传递套接字超时参数后,SolrClient也不会超时
我的SolrClient实现是用java编写的。我一直在测试我的服务和solr_6.6.0上的负载,即使在提到超时参数后,它似乎也没有超时(因为总solr时间的日志消息在splunk中可见,总时间为158秒)。我相信这会导致其他请求出现502(我有几个服务运行实例),solr所花费的时间急剧增加。我还运行了几个solr的复制实例 CloudSolrClient 6.5.1:Java 即使在传递套接字超时参数后,SolrClient也不会超时,java,solr,Java,Solr,我的SolrClient实现是用java编写的。我一直在测试我的服务和solr_6.6.0上的负载,即使在提到超时参数后,它似乎也没有超时(因为总solr时间的日志消息在splunk中可见,总时间为158秒)。我相信这会导致其他请求出现502(我有几个服务运行实例),solr所花费的时间急剧增加。我还运行了几个solr的复制实例 CloudSolrClient 6.5.1: public class SolrClientWrapper { private static final Logger
public class SolrClientWrapper {
private static final Logger LOGGER = LoggerFactory.getLogger(SolrClientWrapper.class);
private final CloudSolrClient solrClient;
private PoolingHttpClientConnectionManager connMgr;
public SolrClientWrapper(List<String> solrZkHosts, Integer maxConnPerRoute,
Integer connectTimeoutInSeconds, Integer connectionRequestTimeoutInSeconds,
Integer socketTimeoutInSeconds, Integer httpClientMaxConn) {
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeoutInSeconds.intValue() * 1000)
.setConnectionRequestTimeout(connectionRequestTimeoutInSeconds.intValue() * 1000)
.setSocketTimeout(socketTimeoutInSeconds.intValue() * 1000)
.build();
connMgr = new PoolingHttpClientConnectionManager();
connMgr.setDefaultMaxPerRoute(maxConnPerRoute.intValue());
connMgr.setMaxTotal(httpClientMaxConn.intValue());
HttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig)
.setConnectionManager(connMgr)
.build();
solrClient = new CloudSolrClient.Builder()
.withZkHost(solrZkHosts)
.withHttpClient(httpClient)
.build();
}
public QueryResponse query(SolrQuery query, String collection) throws SolrClientException {
try {
LOGGER.debug("Making a Solr request for collection={}, query={}: ", collection,query.toString());
QueryResponse response = solrClient.query(collection, query, SolrRequest.METHOD.POST);
LOGGER.info("Response for collection={} and query={} with status={}, timeToExecuteTheQuery={}, totalTimeTaken={}",
collection,query,response.getStatus(),response.getQTime(), response.getElapsedTime());
return response;
} catch (Exception se) {
LOGGER.error("Exception: Query to solr collection failed with exception. collection={} message={}",
collection, se.getMessage(), se);
LOGGER.info("atException connectionPoolStats={}",connMgr.getTotalStats());
throw new SolrClientException(se.getMessage(), se);
}
}
setSocketTimeout
调整数据包之间的等待时间,而不是保持套接字打开的总时间connectionRequestTimeout
是“从连接管理器请求连接时使用的超时(以毫秒为单位)。”。因此,您设置的两个选项都不表示“请求的总时间”。我认为您必须找到一种改变的方法,或者将其包装在一个单独的线程/警报中,您可以超时。“SocketTimeout调整数据包之间的等待时间”:您的意思是,如果不是等待服务器回复(solr)的时间,而是等待其他请求数据包发送到服务器(solr)的时间这是任何数据到达之间的时间;因此,如果是更大的结果集或来自服务器的任何响应,则会重置计时。当结果在某些输出格式下可用时,Solr将对其结果集进行流式处理。您应该能够使用wireshark或tcpdump为其提供服务器
max-limit: 500
http-client-connection-request-timeout-in-seconds: 20
http-client-connect-timeout-in-seconds: 5
http-client-socket-timeout-in-seconds: 20
http-client-max-conn-per-route: 50
http-client-max-conn: 600