【发布时间】:2015-06-22 20:54:39
【问题描述】:
我有一个 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;
}
}
这是人们通过传递dataKey 对象调用我们的库的方式:
DataResponse response = DataClientFactory.getInstance().getData(dataKey);
现在我的问题是:
如何决定我应该为PoolingHttpClientConnectionManager 对象中的setMaxTotal 和setDefaultMaxPerRoute 选择什么?截至目前,我将使用 800 setMaxTotal 和 700 setDefaultMaxPerRoute?这是一个合理的数字还是我应该选择别的?
我的客户端库将在多线程项目的负载非常重的情况下使用。
【问题讨论】:
-
这 45 台机器上是否运行相同的 RestService 应用程序?
-
是的,RestService 正在这 45 台机器上运行。但是客户端库将在一些不同的机器上运行,然后该库将在每个数据中心调用这些 RestService 机器。假设如果呼叫来自 DC1,那么客户端库将调用 DC1 中的 RestService 机器。
-
你能明确解释一下
if call is coming from DC1, then client library will call RestService machine in DC1是如何发生的吗?我看不到 PoolingHttpClientConnectionManager 将如何处理所有这 45 台机器之间的负载平衡。 -
PoolingHttpClientConnectionManager 没有处理那部分。给定 DataKey 对象中的 UserId,如果呼叫来自 DC1 或 DC2 或 DC3,我的库将找出在同一数据中心调用哪台机器的这些详细信息。我正在使用 PoolingHttpClientConnectionManager 以获得更好的性能。
-
啊,谢谢你的澄清:)
标签: java spring connection-pooling apache-httpclient-4.x resttemplate