我有一个RestService在三个数据中心的45个不同机器上运行(每个数据中心15个)。我有一个客户端库,它使用RestTemplate调用这些计算机,具体取决于调用来自何处。如果调用来自DC1,则我的图书馆将调用我在DC1中运行的rest服务,其他人也是如此。

我的客户端库在三个数据中心的不同计算机上运行(而不是在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;
    }

}

这是人们通过传递dataKey对象来调用我们的库的方式:
DataResponse response = DataClientFactory.getInstance().getData(dataKey);

现在我的问题是:

如何确定应为setMaxTotal对象中的setDefaultMaxPerRoutePoolingHttpClientConnectionManager选择什么?截至目前,我将使用800的setMaxTotal和700的setDefaultMaxPerRoute吗?这是一个合理的数字还是我应该选择其他东西?

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

最佳答案

没有适用于所有方案的公式或配方。通常,在阻塞I/O的情况下,每个路由设置的最大最大值应与争用连接的工作线程数大致相同。

因此,拥有15个工作线程和700个连接限制对我来说毫无意义。

07-25 21:20