joh*_*ohn 10 java spring connection-pooling resttemplate apache-httpclient-4.x
我有一个RestService在三个数据中心的45台不同的机器上运行(每个数据中心15个).我有一个客户端库,用于RestTemplate根据呼叫的来源调用这些机器.如果呼叫来自DC1,那么我的库将调用我在DC1中运行的休息服务,对其他人也是如此.
我的客户端库在三个数据中心的不同机器上运行(不在同一台45台机器上).
我使用RestTemplate有HttpComponentsClientHttpRequestFactory如下图所示:
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 which I am making below
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)
.setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build();
SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build();
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
poolingHttpClientConnectionManager.setMaxTotal(800);
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700);
CloseableHttpClient httpClientBuilder = HttpClientBuilder.create()
.setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
.setDefaultSocketConfig(socketConfig).build();
requestFactory.setHttpClient(httpClientBuilder);
return requestFactory;
}
}
Run Code Online (Sandbox Code Playgroud)
这是人们通过传递dataKey对象来调用我们的库的方式:
DataResponse response = DataClientFactory.getInstance().getData(dataKey);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:
如何决定我应该怎么选择setMaxTotal,并setDefaultMaxPerRoute在PoolingHttpClientConnectionManager对象?到目前为止我要800 setMaxTotal和700 setDefaultMaxPerRoute?这是一个合理的数字还是我应该用别的东西?
我的客户端库将在多线程项目中使用非常繁重的负载.
| 归档时间: |
|
| 查看次数: |
3144 次 |
| 最近记录: |