记一次产线httpclient maxPerRoute踩坑

故障过程

产线时不时会出现5xx错误,排查后发现错误很多来自于connectionRequestTimout。

首先想到的是请求外部服务的连接池数量不够,或者网络太差打满连接池,使用arthas分析后发现,连接池数据足够,并且出现错误时,业务流量并不会导致连接不够用。

继续分析代码发现,连接池配置了default-max-per-route,而我们的服务间调用是http请求,每个服务一个域名,多个实例使用反向代理的内网域名提供访问。这个值设置的比较低,导致连接池空闲链接较多的情况下,仍然会出现获取连接超时。

解决办法,调大default-max-per-route,同时集成micrometer,监控连接池使用情况,根据实际情况调整并发上限。对于不同的服务,优先保证核心接口调用,使用max-per-route单独配置。

知识扩展

httpclient封装了java中进行http网络请求的底层实现,是一个被广泛使用的组件。

httpclient是支持池化机制的,这两个参数maxPerRoute及MaxTotal就是表示池化设置的。

服务之间发送http请求常用的有Apache的Fluent以及spring的restTemplate等。对httpclient进行封装的有:Apache的Fluent、es的restHighLevelClient、spring的restTemplate等。

httpclient的连接池3个参数

HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义

1.connectionRequestTimout:指从连接池获取连接的timeout

2.connetionTimeout:指客户端和服务器建立连接的timeout,

就是http请求的三个阶段,一:建立连接;二:数据传送;三,断开连接。超时后会ConnectionTimeOutException

3.socketTimeout:指客户端和服务器建立连接后,客户端从服务器读取数据的timeout,超出后会抛出SocketTimeOutException


httpclient的参数maxPerRoute及MaxTotal

max-total:连接池里的最大连接数

default-max-per-route:每个route默认最大连接数,这里route指的是域名

max-per-route:指定路由的最大连接数


你可能感兴趣的:(记一次产线httpclient maxPerRoute踩坑)