今天群友A出现了一个迷惑性很强的问题,表现是(如上图所示):
网页请求发出时无故出现了300毫秒的延迟,最初怀疑是网络问题。
然而群友A尝试使用postman测试该接口,却一切正常:
因此排除了后端和网络的问题。(注意TCP Handshake 这部分,postman显示0.39毫秒)
此前有群友B看法是,应该是握手阶段出了问题:
但我感觉不像。(事实证明我错了)
我建议群友A从axios开始排查,一层一层的,往下查,甚至浏览器内核都怀疑过,换了浏览器再进行测试,结果仍然如此。
这时,群友A提出了一个新的疑点:这个问题,只有第一次请求(既发起握手时)时间长,第二次就不会出现了。
这个时候我理应怀疑握手阶段有问题了,但我没有。(太蠢了)
随后群友说,这个问题是间隔出现的,也就是第一次有延迟,第二次没有,第三次有延迟,第四次没有,以此类推。
这其实已经很明显了,但我的思路已经歪了(因为一开始就排除了),我甚至一度怀疑是不是数据封包的时候,出了什么问题,导致了延迟。
排查进入了死胡同,众人一筹莫展,这时,某位潜水多时的群友C,一语惊醒梦中人:
我顿呼:卧槽,还真有道理。
但此时思路还没扭过来,我又觉得奇怪,但是这个延迟是间隔出现的,如果只有第一次请求出现延迟后续请求都没有延迟,那应该就是这个问题没错了,可为什么......
这时,群友A恍然大悟:
想想还真是,如果nginx那边为了节省性能,配置了非常短的keepalive的话,就会出现连接刚建立没多久,就会断开,然后下次请求又要重新建立的情况。
群友A之所以感觉这个问题是间隔出现,只是因为他发起两次请求后,连接刚好就断开了。
至此终于破案,众人啼笑皆非,没想到一个看起来非常奇怪的,让我百思不得其解的问题,其实只是因为一个小小的配置项引发的。
还是太年轻了。
这个案例分享给大家,共勉吧,哈哈哈。