记一次线上异样思考【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

解决计划通过弥补机制重试: