RestHighLevelClient初始化http参数的含义

high-level-rest-client 初始化

一般初始化时需要设置验证信息、http相关参数;

 @Bean
 public RestHighLevelClient createClient(){
     return new RestHighLevelClient(
         RestClient.builder(new HttpHost("xxxxxxx.com", 80, HttpHost.DEFAULT_SCHEME_NAME))
             .setRequestConfigCallback( builder->builder
             //这几个timeout用户可以自己调整
                 .setConnectTimeout(1000)
                 .setSocketTimeout(1000)
                 .setConnectionRequestTimeout(1000)
             )
             .setHttpClientConfigCallback(
httpClientBuilder -> httpClientBuilder.setKeepAliveStrategy((httpRequest,httpResponse)-> 50000)
                 .setDefaultCredentialsProvider(getCredProvider())
             )
         );
 }

 private CredentialsProvider getCredProvider(){
     CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
     credentialsProvider.setCredentials(
         AuthScope.ANY, new UsernamePasswordCredentials("elastic", "xxxx"));
     return credentialsProvider;
 }

Http相关参数介绍

keepalive keepalive用以维护长连接,长连接可以复用,但一定情况下需要中断长连接,如长连接长时间没有被使用的场景,需要中断长连接来节省资源。如上述ES客户端初始化案例中,则是设置了idle时间为50s,如果长连接50s依然是空闲状态,则长连接销毁。
connectTimeout 默认值为1s。客户端发出请求时,需要从连接池获取获取一个可用连接。如果连接池内没有空闲连接,并且连接池内连接数没有达到最大连接数,那么客户端会创建一个新连接。ConnectTimeout就是与服务端建立连接的超时时间,如果在设定的 timeout 时间内未能成功连接到服务器,就会抛出 ConnectTimeoutException。
socketTimeout 默认值为30s。每次在 Socket 上调用 write/read 的超时时间,一个请求周期内,可能会在 Socket 上进行多次 write/read,每次都重新计算超时时间。在请求完整地发到服务端后,客户端在Socket上第一次调用 read 方法,这一次的Socket Timeout也表示服务端处理业务的超时时间。如果请求或响应很大或者网络不好( 频繁丢包/重传 )时,客户端可能会调用 write/read 很多次,此时会出现实际调用时间远大于 Socket Timeout 时间的情况。
connectionRequestTimeout 默认值为1s。客户端在发请求时,需要从连接池获取获取一个可用连接,如果连接池内连接数已达到最大值,此时需要等待一个空闲连接。ConnectionRequestTimeout就是从连接池获取一个connection的最大等待时间。如果在 timeout 时间内没有获取 connection,会抛出 ConnectionPoolTimeoutException。
maxConnPerRoute 默认值为10。每个地址(路由)的最大连接数,并发请求数越大,每次请求花费时间越长,需要的连接数就要越大,避免为了获取连接进行长时间的等待。该值受到maxConnTotal的限制。
maxConnTotal 默认值为30。连接池的最大连接数,并发请求数越大,每次请求花费时间越长,需要的连接数就要越大,避免为了获取连接进行长时间的等待。

maxConnPerRoute参数理解

maxConnPerRoute中对路由应该怎么理解?一个域名算一个路由,还是一个域名对应多个IP时每个IP都各算一个路由?
在 HttpClient 中,路由是指连接到特定主机和端口的连接。如果一个域名对应多个 IP 地址,那么每个 IP 地址都算一个路由。

在设置 maxConnPerRoute 参数时,需要根据实际情况来确定每个路由的最大连接数。如果应用程序需要频繁地连接到同一个主机和端口,那么可以适当增加 maxConnPerRoute 的值,以提高连接的复用率和性能。

实际生产中,一般使用SLB域名,此时一个业务进程(或Pod),会通过域名访问到多个IP(多个服务端节点),也就是会有多个路由,此时每个路由最大连接数由maxConnPerRoute控制,整个业务进程访问服务端的最大连接由 maxConnTotal 控制。

你可能感兴趣的:(java,elasticsearch,httpClient)