maxConnPerRoute vs maxConnTotal

Last Modified: 2023/03/21

前言

使用 rest template 必须要做一些配置,如果不配置,可能会导致严重的性能问题,特别是超时时间的配置尤其重要,下面给出一个基本的配置的范例:

private static ClientHttpRequestFactory getClientHttpRequestFactory() {
  int timeout = 30000;
  RequestConfig config = RequestConfig.custom()
      // 设置连接建立的超时时间
      .setConnectTimeout(timeout)
      // 设置从连接池中获取一个连接的超时时间
      .setConnectionRequestTimeout(timeout)
      // 设置等待数据的超时时间,或者说两个连续数据包之间的最大时间间隔
      .setSocketTimeout(timeout)
      .build();
          
  CloseableHttpClient client = HttpClientBuilder.create()
      .setDefaultRequestConfig(config)
      .setMaxConnTotal(1000)
      .setMaxConnPerRoute(200)
      .build();
          
  return new HttpComponentsClientHttpRequestFactory(client);
}

maxConnPerRoute

先提出一个问题,这里的 route 究竟是什么呢?如果我们用 rest template 发送两个请求,url 分别为:http://192.168.2.24/hello 和 http://192.168.2.24/info,那么这两个 url 是不同的 route 还是同一个 route呢?

route 实际上是 HttpRoute 的实例,先看下面的请求以及请求对应的 HttpRoute 对象:

restTemplate.getForObject("https://192.168.2.24:8011/hello", String.class)

从上面的图中可以看出,HttpRoute 对象实际上不包含 path 部分,包含的部分包括 schema、hostname 和 port 等。因此上面问题的答案就显而易见了,他们是同一个 route。

注:hostname 可能是 ip 地址,也有可能是 domain。

maxConnPerRoute 指的是每个 route 最多能建立多少个连接。因此如果 rest template 大量调用同一个服务,即大量的 route 都相同,此时应该调大该参数的值,否则将造成大量请求积压。

maxConnTotal

该参数配置总的连接数数是多少,即所有 route 的连接数之和不能超过该参数配置的值。

有问题吗?点此反馈!

温馨提示:反馈需要登录