记一次http请求阻塞引发的严重bug

1,224 阅读3分钟

前言

本来开开心心摸着鱼,突然收到tapd缺陷提醒,打开一看一个严重优先级高的bug,一个是重新打开bug,其实两个是同一个bug。

我打开重新打开的bug单看了下,下面之前负责这个项目的同事留言:可能存在于客户浏览器版本、网络环境、代理网管诸多方面的原因导致,延期处理、持续观察。(还是九月底的单)

现在要求我们春节后第一个版本要把这个bug修复了。

背景

我们有个系统A,其中有个页面展示不同的项目,然后点击不同项目重新打开窗口跳转到项目B(默认跳转到概览页)。我们在第一个项目B窗口切到页面X(左边菜单树,右边table表格),可以正常显示;再打开了第二个项目B切到X页面,发现页面一直无数据(因为这个页面左边树接口没有加loading,造成了错误判断)。

问题排查

很自然在我们自己开发、测试环境试了下,并不能复现,然后找了个客户现场机器远程看了下。 发现第二次打开窗口切到页面后,请求的请求一直pending;马上第一反应找后端,心想:接口pending关我前端什么事。

我找到后端battle。

我说:你们后端有没有什么特殊限制,把问题描述了下。

然后他打开远程,我们一起看了下,在打开第二个窗口的X页面,F12发现js文件都pending了。

我顿时语塞,是我莽撞了,说了句:我再去看看吧。灰溜溜的跑了。

我换了Edge浏览器试了下一样的问题,然后各种百度什么情况会挂起请求,可惜网上说的那些原因,应该都不是我这个问题。我又远程试了很多遍,发现这个概览页面有四个图表接口一直在pending,很久都没有响应,然后我开始怀疑是不是浏览器请求太多造成的阻塞问题。

然后通过不断测试验证我的猜测,我在一个浏览器里来回切换概览页页X页也有这种问题;不仅和X页面,其他页面我都测试过都一样。因为网关超时设置了有六分钟,我就开着等过了六分钟后请求超时后,X页面数据就正常展示出来了;然后在浏览器给这几个请求添加Block request之后,确实来回切换其他页面也没有问题了。所以我可以确定就是请求太多造成的问题了。

思考

在开始复现这个问题的时候,我直接复制url,在两个窗口分别粘贴的时候不会出现这种情况,不是很明白,他这种跳转开打窗口是有点类似seesion 打开窗口还是属于同一个会话级别一种意思吗?

中间自己在本地起了一个node服务,写了几个请求让他们几分钟之后响应,在本地页面去调用,发现同时超过6个请求好像也不会阻塞,即使上面有很多请求pending,他照样在X页面完成了请求渲染了。