Does anyone have any idea on this? On Mon, Jun 22, 2015 at 2:51 PM, Check Peck <comptechge...@gmail.com> wrote:
> 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 >