I have a RestService running on 45 different machines in three datacenters
(15 in each datacenter). I have a client which uses RestTemplate to call
these machines depending on where the call is coming from. If the call is
coming from DC1, then it will call my rest service running in DC1 and
similarly for others.
I am using RestTemplate with HttpComponentsClientHttpRequestFactory as
shown below:
public class DataProcess {
private RestTemplate restTemplate = new RestTemplate();
private ExecutorService service = Executors.newFixedThreadPool(15);
// singleton class so only one instance
public DataProcess() {
restTemplate.setRequestFactory(clientHttpRequestFactory());
}
public DataResponse getData(DataKey key) {
// do some stuff here which will internally call our RestService
// by using DataKey object and using RestTemplate
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory requestFactory = new
HttpComponentsClientHttpRequestFactory();
RequestConfig requestConfig =
RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)
.setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build();
PoolingHttpClientConnectionManager
poolingHttpClientConnectionManager = new
PoolingHttpClientConnectionManager();
poolingHttpClientConnectionManager.setMaxTotal(300);
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(300);
CloseableHttpClient httpClientBuilder =
HttpClientBuilder.create()
.setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig).build();
requestFactory.setHttpClient(httpClientBuilder);
return requestFactory;
}
}
And this is the way people will call our library by passing dataKey object:
DataResponse response =
DataClientFactory.getInstance().getData(dataKey);
*Now my question is:*
1) How to decide what should I choose for setMaxTotal and
setDefaultMaxPerRoute in PoolingHttpClientConnectionManager object? As of
now I am going with 300 for both of them? Should I go with 500 or something
else?
2) Also do I need to turn off Nagle's algorithm (TCP_NODELAY) and turn on
TCP keep-alive packets (SO_KEEPALIVE) for better performance here? If yes,
then what's the right way to do this?
I am trying to get best performance out of HttpClient. My client library
will be used under very heavy load in multithreading project. I am using
Apache HttpClient 4.3