场景:
开发反馈测试环境A应用通过httpclient连接B应用,偶发java.net.socketException: connection reset报错。
理解 Connection reset:
在我看来 Connection reset分为2种情况:
第一种Connection reset by peer:
服务器返回了RST时,如果此时客户端正在往Socket套接字的输入流中写数据则会提示"Connection reset by peer"。
第二种java.net.socketException: connection reset:
服务器返回了RST时,如果此时客户端正在从Socket套接字的输出流中读数据则会提示Connection reset";
那么不管那种情况 其实都是服务器返回了RST标志位,但是客户端还在进行输入输出数据,
通过以上描述,猜测Connection reset的原因是客户端连接保活机制超时回收连接,但是服务端还在使用该连接池导致报错。
排查过程:
首先肯定是自己去模拟错误,但是这个模拟错误代价有点大,毕竟是偶发现象。连续访问几十次都没模拟出问题。之后我只能放弃挣扎去看两个应用的相关日志 看能不能找到一点猫腻,比如在这里我会根据traceid跟踪整条链路,但是几乎没什么收获。之后配合开发将连接地址改成直连,这里说一下我这环境是k8环境。 然后直连模拟了大概一天。并没有出现connection reset。
那么问题肯定是出在连接svc地址的时候出现了connection reset问题。
目前该环境用的模式是ipvs