简述

  最近项目中出现一个问题,前端每隔1秒向同一个url发起请求,第一次请求响应时间2秒左右,此后每次请求耗时会增加大约1秒,直到超时。

定位和验证

后台

  增加日志观察后台服务耗时情况,发现每次均耗时2秒左右,和前端第一次请求耗时差不多,后续也没有明显增长,基本可以排除后台服务的问题

浏览器

  首先是在项目指定的浏览器chrome上发现的问题,之后分别测试了edeg/firefox/ie,只在edeg上复现了问题,而edeg又是使用的Chromium内核,因此猜测是Chrome的某种机制导致的问题。

  打开chrome控制台,查看请求耗时的详情,如下:

    

  观察多次请求的耗时明细,发现真正发起请求到响应的时间依然稳定在2秒左右,这和后台观察到的情况是一样的。

  真正导致请求超时的是Connection Start:Stalled,这一项每次稳定增长1秒左右,最终导致超时。

  那么这个Stalled是何方神圣呢,chrome文档(https://developer.chrome.com/docs/devtools/network/reference/)如下:

  Here's more information about each of the phases you may see in the Timing tab:

  Queueing. The browser queues requests when:

  The browser is briefly allocating space in the disk cache    浏览器正在准备缓存

  There are already six TCP connections open for this origin, which is the limit. Applies to HTTP/1.0 and HTTP/1.1 only.  针对每个源,最多打开6个TCP连接

  There are higher priority requests.    有更高优先级的请求

  Stalled. The request could be stalled for any of the reasons described in Queueing.

  Stalled:在满足Queueing的任意一种条件时,请求将会停滞(阻塞)。

  更高优先级的请求此时并不存在,排除;TCP连接数量限制此时也未达上限,而且同网站的其他请求并未受影响,排除(对于TCP连接和数量限制后续可以再研究一下);

  同时在StackOverFlow上我找到一个类似的问题:https://stackoverflow.com/questions/27513994/chrome-stalls-when-making-multiple-requests-to-same-resource,其中一个回答如下:

  Yes, this behavior is due to Chrome locking the cache and waiting to see the result of one request before requesting the same resource again. The answer is to find a way to make the requests unique.

  I added a random number to the query string, and everything is working now.

  哈哈,完美契合缓存猜想,马上验证

    

验证1:在请求url上添加随机值

  将url由http://localhost:8080/master/timed修改为http://localhost:8080/master/timed?HxkNkz4Wwe

  结果:bingo!问题解决,所有请求并发进行,不再阻塞!    

  那么能不能通过后端的响应来解决问题呢?于是又做了一些验证

验证2:修改响应头,试图控制浏览器的缓存行为

  分别修改Cache-Control响应头的值为no-store/no-cache/no-store,no-cache/max-age=3, must-revalidate,观察

  结果:前面3种毫无反应;对于第4种,结果如下:

  

  没有缓存时,请求从后台获取数据,然后缓存到本地;有缓存时,请求直接从磁盘缓存获取数据,对于接口类的请求来说这有可能获取到过期的数据,显然是不可接受的,事实上,一般之后资源类的数据(js/css/图片等)才会通过缓存获取。

结论

在拿到响应之前,chrome会将资源(以url表示)相关的缓存锁住,后续所有相同的url请求都必须在队列中等待,直到前面的请求及缓存处理完之后才能依次进行。

要解决这个问题,只要每次请求时在链接上加个随机值就好了。

转自:Stalled:一次请求超时异常处理 - 码农教程

Stalled:一次请求超时异常处理相关推荐

  1. axios请求失败重新发起请求_vue axios请求超时,设置重新请求的完美解决方法

    //在main.js设置全局的请求次数,请求的间隙 axios.defaults.retry = 4; axios.defaults.retryDelay = 1000; axios.intercep ...

  2. 解决axios请求超时

    简介 在vue中经常使用axios发起网络请求,与服务器进行数据交互.在使用过程中会有许多问题存在,比如由于网络不稳定导致请求超时/失败,通常有两种解决方案,一种是提示用户重新提交请求,另一种是进行相 ...

  3. SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

    在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...

  4. php 访问超时,PHP http请求超时问题解决方案

    这篇文章主要介绍了PHP http请求超时问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,http请求超时时间 可能出现的场景: 1 ...

  5. springmvc请求参数异常处理

    springmvc请求参数异常处理 参考文章: (1)springmvc请求参数异常处理 (2)https://www.cnblogs.com/nosqlcoco/p/5844160.html 备忘一 ...

  6. 宿主机( win 7 系统) ping 虚拟机VMware( cent os 6.6 ) 出现“请求超时”或者“无法访问目标主机”的解决方法

    宿主机( win 7 系统) ping 虚拟机VMware( cent os 6.6 ) 出现"请求超时"或者"无法访问目标主机"的解决方法 参考文章: (1) ...

  7. 解决在vue中axios请求超时的问题

    解决在vue中axios请求超时的问题 参考文章: (1)解决在vue中axios请求超时的问题 (2)https://www.cnblogs.com/zhouyangla/p/8757149.htm ...

  8. 使Git与代理服务器一起使用-因“请求超时”而失败

    如何让Git使用代理服务器? 我需要从Git服务器中检出代码,但每次都会显示"请求超时". 我该如何解决? 或者,如何设置代理服务器? #1楼 如果配置代理服务器的命令行方法不起作 ...

  9. windows或Ubuntu中请求github.com请求超时,或在下载GitHub文件出现:<urlopen error [Errno 110] Connection timed out>

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 windows或Ubuntu中请求github.com请求超时,或在下载GitHub文件出现:urlopen error ...

最新文章

  1. idea中修改项目代码后,Git没有提示代码有改动(解决办法)
  2. flutter 实现不可滚动的ListView构建器
  3. Java常见排序算法之直接选择排序
  4. 用gradle启动java项目_构建Java项目
  5. 以下是ECMAScript 2016、2017和2018中所有新增功能的示例
  6. Android 浮窗开发之窗口层级
  7. centos卸载不必要的程序_在RHEL / CentOS 7上禁用和删除不需要的服务最小安装
  8. Swift Basic 3
  9. mysql group by cube_group by、grouping sets、with rollup、with cube方法
  10. MySQL数据库基础命令
  11. 异步处理Promise
  12. Idea起服务报错java heap space,GC overhead limit exceeded,Information:javac 1.8.0_181 was used to comp解决办法
  13. STM32CubeIDE 使用技巧和说明
  14. js return加分号_js分号的重要性
  15. 【高德地图API】申请key全流程
  16. mysql 月初 月末_月初月末sql语句(日期所在月的第一天,最后一天)
  17. 色即是空之临时演员[韩国]
  18. [Vue][面试]谈一谈对vue的设计原则的理解
  19. 古希腊神话故事4 :伊娥
  20. rg1 蓝光危害rg0_LED蓝光危害评价的最新标准及测试方案介绍

热门文章

  1. BZOJ3597: [Scoi2014]方伯伯运椰子
  2. C# 导出和导入excel
  3. ExplorEnz:The Enzyme database网站功能简介
  4. 【Excel VBA】新建工作表-踩坑多年经验教训
  5. 双十一即将来临 小心你的口袋
  6. ORACLE DATAGUARD参数释义
  7. 卡内基梅隆大学机器人研究所教授最新力作:移动机器人学
  8. C#学生成绩查询(使用方法实现,查最大值,最小值,平均值,升序,降序)
  9. matplotlib.image和matplotlib.pyplot
  10. Python logging库