如何确定setMaxTotal和setDefaultMaxPerRoute的最佳设置?

joh*_*ohn 10 java spring connection-pooling resttemplate apache-httpclient-4.x

我有一个RestService在三个数据中心的45台不同的机器上运行(每个数据中心15个).我有一个客户端库,用于RestTemplate根据呼叫的来源调用这些机器.如果呼叫来自DC1,那么我的库将调用我在DC1中运行的休息服务,对其他人也是如此.

我的客户端库在三个数据中心的不同机器上运行(不在同一台45台机器上).

我使用RestTemplateHttpComponentsClientHttpRequestFactory如下图所示:

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,并setDefaultMaxPerRoutePoolingHttpClientConnectionManager对象?到目前为止我要800 setMaxTotal和700 setDefaultMaxPerRoute?这是一个合理的数字还是我应该用别的东西?

我的客户端库将在多线程项目中使用非常繁重的负载.

ok2*_*k2c 6

没有可以应用于所有方案的公式或配方.通常使用阻塞i/o,每个路由设置的最大值应与争用连接的工作线程数大致相同.

因此,拥有15个工作线程和700个连接限制对我来说没什么意义.