记一次线上异样思考【HTTP】
背景
领取时向渠道申请,偶发的呈现了NoHttpResponseException异样,频次不高,没有法则。
异样申请重试之后数据都是失常的。
这种能够排除是业务代码问题,问题可能就呈现再HttpClient使用上了。
简要剖析和解决方案
我的项目中利用到了长连贯能够回顾下 :
- HTTP的keep-alive个别咱们都会带上两头的横杠,一般的HTTP连贯是客户端连贯上服务端,
而后完结申请后,由客户端或者服务端进行http连贯的敞开。下次再发送申请的时候,
客户端再发动一个连贯,传送数据,敞开连贯。这么个流程重复。
然而一旦客户端发送connection: keep-alive头给服务端,
且服务端也承受这个keep-alive的话,这个连贯就能够复用了。
一个HTTP解决完之后,另外一个HTTP数据包也间接从这个连贯发送。
缩小新建和断开TCP连贯的耗费。
<br/>
<br/> - TCP的keepalive是偏重在放弃客户端和服务端的连贯,
一方会不定期发送心跳包给另一方,
没有断掉一方的定时发送几次心跳包。如果距离发送几次,
对方都返回的是RST,而不是ACK,那么就开释以后连贯。
从HTTP长连贯和TCP长连贯能够揣测到:进入客户端刚刚获取到了HTTP的连贯,而服务端的TCP监测到长时间没有通信
端开了TCP。断开后HTTP申请就会被回绝掉,就会导致NoHttpResponseException。
异样复现:
在程序获取到连贯后调用之前断点(在建设长连贯后),期待服务端TCP断开,而后触发调用
能够看下抓包的数据(192. 为本地) (172.* 为近程),超过一段时间TCP没有通信,近程服务端会断开TCP
解决计划通过弥补机制重试: