我有一个RestService在三个数据中心的45个不同机器上运行(每个数据中心15个)。我有一个客户端库,它使用RestTemplate
调用这些计算机,具体取决于调用来自何处。如果调用来自DC1,则我的图书馆将调用我在DC1中运行的rest服务,其他人也是如此。
我的客户端库在三个数据中心的不同计算机上运行(而不是在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;
}
}
这是人们通过传递
dataKey
对象来调用我们的库的方式:DataResponse response = DataClientFactory.getInstance().getData(dataKey);
现在我的问题是:
如何确定应为
setMaxTotal
对象中的setDefaultMaxPerRoute
和PoolingHttpClientConnectionManager
选择什么?截至目前,我将使用800的setMaxTotal
和700的setDefaultMaxPerRoute
吗?这是一个合理的数字还是我应该选择其他东西?我的客户端库将在多线程项目中非常重的负载下使用。
最佳答案
没有适用于所有方案的公式或配方。通常,在阻塞I/O的情况下,每个路由设置的最大最大值应与争用连接的工作线程数大致相同。
因此,拥有15个工作线程和700个连接限制对我来说毫无意义。