最近在研究慢请求监控的问题,写了一个简单的测试代码:在网页端(index.html)通过fetch函数向服务端获取数据,然后打印请求耗时。

function requestData() {

let start = new Date();

fetch("http://localhost:3000/company/basic")

.then(res => {

return res.json();

})

.then(res => {

let span = new Date() - start;

console.log("span:", span);

});

}

requestData();

在服务端通过setTimeout延时1500s才返回数据(服务端使用ExpressJS)。

app.get("/company/basic", (req, res) => {

setTimeout(function() {

res.send({ hello: "Hello Fundebug!" });

}, 1500);

});

不出所料,span数据都略微大于 1500。

而后,我突发奇想,假设我同时发送多个请求会怎么样呢?于是有了如下代码:

[1, 2, 3].forEach(function() {

requestData();

});

结果好像也没问题,在 Chrome 浏览器下面是这个效果:

接入 Fundebug 慢请求监控测试

于是愉快地接入 Fundebug 监控:

apikey="API-KEY"

>

并设置如果请求时长超过 2 秒就上报:

if ("fundebug" in window) {

fundebug.httpTimeout = 2000;

}

本以为刷新页面,应该不会收到报错。

结果,万万没想到的是,Fundebug 收到 2 个慢请求报错。

这不科学啊!

点开错误详情,可以看到具体的报错信息。一个请求耗时 3018 毫秒,一个请求耗时 4525 毫秒。

也就是说,第一个请求没问题,假设是 1500 毫秒。我们把三个请求的时间放一起看看有何规律:1500,3018,4524。他们近似成等差数列,相差 1500 毫秒。于是,我怀疑三个请求是一个一个阻塞式的,而不是并发的。

测试并发请求不同 API 的情况

为了验证这一点,我将测试改为请求三个不同的 API 接口。

服务端代码:

app.get("/company/basic", resp);

app.get("/company/basic1", resp);

app.get("/company/basic2", resp);

function resp(req, res) {

setTimeout(function() {

res.send({ hello: "Hello Fundebug!" });

}, 1500);

}

网页端代码(requestData函数传入请求的 URL):

[

"http://localhost:3000/company/basic",

"http://localhost:3000/company/basic1",

"http://localhost:3000/company/basic2"

].forEach(function(item) {

requestData(item);

});

为了获取请求数据,将httpTimeout改为 1500。

if ("fundebug" in window) {

fundebug.httpTimeout = 1500;

}

Fundebug 捕获三个请求的时间,分别为 1526,1525,1529。

至此大体验证了刚刚的假设:对同一个 API 接口的并发请求会被阻塞,对不同的 API 接口并发请求正常执行。

那么为什么会被阻塞呢?意图何在?接下来慢慢给各位介绍。

背后的原因

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.

也就是说,Chrome 特意做了这样的设计。对于连续的相同请求,Chrome 会阻塞后面的请求,直到前面的完成。通过判断前面的请求返回的 Header 里面的缓存设置来决定下一步的行动。

我们可以做个实验来验证一下。

缓存实验

服务端设置缓存 2 秒

在服务端的接口返回代码中配置缓存时间 res.setHeader("Cache-Control", "public, max-age=2");

服务端设置不缓存 res.setHeader(

"Cache-Control",

"private, no-cache, no-store, must-revalidate"

);

Chrome 开发者面板设置Disable Cache

最后的疑问

为什么打开和不打开谷歌开发者控制台,行为会不一样了?

其实是有原因的,而且这个干扰项一度成功阻止了我发现问题的本质。当我们在开发前端项目的时候,代码的改动希望能够实时地反应到网页上,而不是受到浏览器缓存的影响,但是我们发现往往刷新页面的时候没有真的去服务端获取数据,还是老的信息。于是,我们会去配置一个选项,将Disable Cache设置为true。也就是说,在开发环境下,缓存是被禁用了的,也就不存在等待第一个请求返回然后判断其 Header 里面Cache-Control设置的问题。这也是为什么打开谷歌开发者控制台,请求没有等待,立即执行了。

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有阳光保险、核桃编程、荔枝FM、掌门1对1、微脉、青团社等众多品牌企业。欢迎大家免费试用!

版权声明

java请求慢_为什么重复的GET请求变慢了?相关推荐

  1. java请求参数_在Java中发送http的post请求,设置请求参数等等

    前几天做了一个定时导入数据的接口,需要发送http请求,第一次做这种的需求,特地记一下子, 导包 import java.text.SimpleDateFormat; import java.util ...

  2. 怎么看java请求耗时_使用Filter计算请求耗时

    使用Filter计算请求耗时 有时为了更详细的检测web系统性能,需要计算每次请求到响应所耗费的时间,然后看看哪些请求耗时较多,从而有针对性的进行优化操作,此时可以使用Filter过滤器自己实现一个请 ...

  3. java请求注释_求达人给java代码【注释】!!请求尽量详细,万分感谢!!

    (1)定义一个接口Inf,含有常量π和一个实现计算功能的方法calculate(),再分别定义一个面积类area和一个周长类circumference,各自按计算圆面积和圆周长具体实现接口中的方法,并 ...

  4. JMeter之Java请求

    一.JMeter中Java请求是什么? Java请求属于JMeter里的取样器,简单使用跟Beanshell差不多,都能够实现运行一定的Java代码逻辑,但Java请求功能更强大. 为什么要用Java ...

  5. jmeter测试java接口测试_简单易学的测试攻略:JMeter测试Java请求示例

    JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,大家可以到官网下载源代码和查看相关文档. 关于使用JMeter进行JDBC数据库测试.HTTP请求接 ...

  6. java请求接口示例_用示例解释Java接口

    java请求接口示例 介面 (Interfaces) Interface in Java is a bit like the Class, but with a significant differe ...

  7. jmeter java性能_使用JMeter进行性能测试(Java请求)

    来源:http://wangym.iteye.com/blog/731729 看了两篇如何使用JMeter在HTTP请求及数据库方面做性能测试的文章(如下两个链接),感受到这款工具的强大及易用.我在这 ...

  8. 学习笔记:Java 并发编程②_管程

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  9. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

最新文章

  1. Android屏幕像素密度适配详解
  2. spring 依赖注入
  3. HttpClient 教程 (二)
  4. Siamese Network (应用篇1) :孪生网络特征用于图像匹配 ICPR2016
  5. Gym - 215177C 玩游戏
  6. uva 10594(最小费用最大流)
  7. 无痕 PS、读得懂文字,OpenAI 的二代 DALL·E 惊艳亮相
  8. Kubernetes RBAC 详解
  9. JAVA性能优化权威指南 读书笔记(一)
  10. 通过http网页链接下载单词音频文件
  11. 怎么用美图秀秀制作证件照
  12. 证件照排版软件_不会用PS做证件照?Word也能排版打印1寸照,一键轻松搞定
  13. 从专业角度分析国内创客教育发展
  14. C语言数字图像处理---2.3图像空域滤波
  15. AE2022 for Mac安装包+安装教程
  16. 中医是如何辩证出脾胃湿热的?
  17. uniapp中上传图片并实时预览
  18. GlobalSign的旗下的SSL证书产品
  19. Unity 实现贴花效果的制作教程
  20. 闲人闲谈PS之三十三——项目承诺成本管理

热门文章

  1. FCN、Unet、Unet++:医学图像分割网络一览
  2. 小白也能看懂的Matplotlib简明教程
  3. ORB特征均匀提取策略对性能的提升有多大?
  4. 基于YOLOv3和PyTorch 的视频-图像模型
  5. 收藏 | 图像分割深度学习从零开始学习路线
  6. github上传流程图记录
  7. Python 排序的姿势,你们,你们还要学习..学习一个
  8. 小测一下fastjson的速度(纯娱乐)
  9. EditText中的几个常用属性
  10. linux 文件查找及定位