499状态码解释:
Nginx中 499状态码的定义是 client has closed connection,也就是客户端断开了连接。
一般发生499的有几种原因:
1.客户端觉得服务端太慢了,主动断开了,这个时候客户端设置了链接超时时间
2.在客户端操作有时候,关闭了页面和取消了请求。
第2种情况在服务器日志里面看到Broken pipe 完全可以忽略。但是第1种情况为什么客户端会觉得服务端太慢呢?有可能是服务端接口返回时间特别长,有可能阻塞,还有可能是网络问题。
如果真的是接口性能问题,这个还好解决,如果超时时间超过了客户端设置的超时时间,偶发的499问题?我们该怎么排查。先看一下业务场景客户端通过网关转发到上游服务,具体简单时序图如下:
如果七层网关和api网关都不设置超时时间,客户端到上游的超时时间就是,SDK里面设置的链接超时时间。我们看几个比较重要的时间参数:
问题来了怎么分析为什么建立连接时间长呢?当然必须用抓包来验证TCP三次握手是否正常。具体那一段传输出现问题,必须上下游协同一起抓包,抓包策略一定不能影响生产环境。当然到用到抓包的方式,也是所有的方法都排查了,果真到最后找到了问题,果然是没有回包。
在我们和上下游排查问题或者跨部门协作排查问题的时候,首先要证明自己没问题,你自己的日志全不全?你能证明你没有问题,能给上下游提供一些解决问题的思路?你自己对你出示的数据和材料最好能帮助别人排查问题。
当然可能大家都不会承认自己的问题,至于到最后是谁的问题其实并不重要,最重要的是排查问题的过程。反思自己说过不合适的话和做过不合适的事,关注重要的事情,不断成长才是最重要的。