maxConnPerRoute vs maxConnTotal
前言
使用 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 的连接数之和不能超过该参数配置的值。
有问题吗?点此反馈!
温馨提示:反馈需要登录