项目场景:
在A服务中通过自己实现的HttpClient请求B服务,偶尔出现NoHttpResponseException : failed to respond
url: http://B-host:port/xxx
QPS: 100 - 700
抓包工具: wireshark
A服务ClientConfig参数(本次需要关注的):
AsyncHttpClientConfig.maxConnections: 500
AsyncHttpClientConfig.maxConnectionsPerHost: 500
AsyncHttpClientConfig.pooledConnectionIdleTimeout: 120秒
B服务的nginx配置:
keepalive_timeout: 65s
问题定位
- B服务正常运行情况下,A服务请求时出现NoHttpResponseException : failed to respond
- 这个问题网上有很多文章,大多解释是因为客户端拿已经关闭的连接继续请求导致的
结论: 因为A服务请求连接超过120s才被关闭,B服务是超过65s才会被关闭。所以当请求闲置65秒B服务关闭连接通知A服务时,A服务在没有收到通知时使用此链接发起了请求就会出现NoHttpResponseException
验证推断:
这个问题判断起来很简单