API 请求慢?这次锅真不在后端

搭建自己的内网穿透,告别ngrok速度慢的问题,调试本地服务(两种方式,源码部署或者部署包部署,新手直接部署包部署) 内网穿透frp frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 frp开源地址链接 源码部署 下载源码 配置客户端 在frpc 目录下面添加配置文件 frpc.ini [common] server_addr = xx.xx.xx.xx 注意替换成自己的服务器公网ip端口 server_port = 7000 [web01] type = http #访问协议 阅读详情

问题

我们在开发过程中,发现后端 API 请求特别慢,于是跟后端抱怨。

“怎么 API 这么慢啊,请求一个接口要十几秒”。

而且这种情况是偶现的,前端开发同学表示有时候会出现,非必现。

但是后端同学通过一顿操作后发现,接口没有问题,他们是通过 postman 工具以及 test 环境尝试,都发现接口请求速度是没有问题的。

“那感觉是前端问题”?

我们来梳理一下问题,如下:

  • 后端 API 请求特别慢,而且是偶现的。
  • 在 test 环境没有复现。
  • postman 工具请求没有复现。

问题解决过程

时间都去哪了?

第一个问题,API 耗费的时间都用来做什么了?

我们打开 Chrome 调试工具。在 network 中可以看到每个接口的耗时。

hover 到你的耗时接口的 Waterful,就可以看到该接口的具体耗时。

可以看到,其耗时主要是在 Stalled,代表浏览器得到要发出这个请求的指令到请求可以发出的等待时间,一般是代理协商、以及等待可复用的 TCP 连接释放的时间,不包括 DNS 查询、建立 TCP 连接等时间等。

所以 API 一直在等待浏览器给它发出去的指令,以上面截图的为例,整整等待了 23.84S,它请求和响应的时间很快(最多也就几百毫秒,也就是后端所说的接口并不慢)。

所以 API 到底在等待浏览器的什么处理?

什么阻塞了请求?

经过定位,我们发现,我们项目中使用 Server-Sent Events(以下简称 SSE)。它跟 WebSocket 一样,都是服务器向浏览器推送信息。但不同的是,它使用的是 HTTP 协议。

当不通过 HTTP / 2 使用时,SSE 会受到最大连接数的限制,限制为 6 次。此限制是针对每个浏览器 + 域的,因此这意味着您可以跨所有选项卡打开 6 个 SSE 连接到 www.example1.com,并打开 6 个 SSE 连接到 www.example2.com。这一点可以通过以下这个 demo 复现。

复制问题的步骤:

  • 访问http://ssebin.btubbs.com/multi/
  • 单击添加计数器6或更多次
  • 尝试打开另一个标签到同一地址

结果是,第 6 次之后,SSE 请求一直无法响应,打开新的标签到同一个地址的时候,浏览器也无法访问。

效果图如下:

该问题在 Chrome[1] 和 Firefox[2] 中被标记为“无法解决”。

至于偶现,是因为前端开发者有时候用 Chrome 会打开了多个选项卡,每个选项卡都是同一个本地开发地址,就会导致达到 SSE 的最大连接数的限制,而它的执行时间会很长,也就会阻塞其他的请求,一致在等待 SSE 执行完。

所以解决的方法是什么?

解决方案

简单粗暴的两个方法

  • 不要打开太多个选项卡。这样就不会达到它的限制数。(因为我们一个选项卡只请求一个 SSE)。
  • 开发环境下,关闭该功能。

使用 HTTP / 2

使用 HTTP / 2 时,HTTP 同一时间内的最大连接数由服务器和客户端之间协商(默认为 100)

这解释了为什么我们 test 环境没有问题,因为 test 环境用的是 HTTP / 2。而在开发环境中,我们使用的是 HTTP 1.1 就会出现这个问题。

那如何在开发环境中使用 HTTP / 2 呢?

我们现在在开发环境,大部分还是使用 webpack-dev-server 起一个本地服务,快速开发应用程序。在文档中,我们找到 server[3] 选项,允许设置服务器和配置项(默认为 'http')。

只需要加上这一行代码即可。

devServer: {
+  server: 'spdy',
  port: PORT,
}

看看效果,是成功了的。

原理使用 spdy[4] 使用自签名证书通过 HTTP/2 提供服务。需要注意的一点是:

该配置项在 Node 15.0.0 及以上的版本会被忽略,因为 spdy 在这些版本中不会正常工作。一旦 Express 支持 Node 内建 HTTP/2,dev server 会进行迁移。

总结归纳

原本这个问题认为跟前端无关,没想到最后吃瓜吃到自己头上。提升相关技能的知识储备以及思考问题的方式,可能会方便我们定位到此类问题。

充分利用好浏览器的调试工具,对一个问题可以从多个角度出发进行思考。比如一开始,没想到本地也可以开启 HTTP / 2。后来偶然间想搜下是否有此类方案,结果还真有!

参考资料

[1] Chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=275955

[2] Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=906896

[3] server: https://webpack.docschina.org/configuration/dev-server/#devserverserver

[4] spdy: https://www.npmjs.com/package/spdy

聊聊接口性能优化的11个小技巧 前言 接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。 该问题说简单也简单,说复杂也复杂。 有时候,只需加个索引就能解决问题。 有时候,需要做代码重构。 有时候,需要增加缓存。 有时候,需要引入一些中间件,比如mq。 有时候,需要需要分库分表。 有时候,需要拆分服务。 等等。。。 导致接口性能问题的原因千奇百怪,不同的项目不同的接口,原因可能也不一样。 本文我总结了一些行之有效的,优化接口性能的办法,给有需要的朋友一个参考。 1.索引 阅读详情

相关推荐

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了YOLOv11多模态融合技术,重点介绍基于YOLOFuse框架的RGB与红外线(IR)协同检测方法。通过动态权重分配、跨模态特征对齐等创新设计,实现在低光照等复杂环境下的高精度目标检测,mAP提升高达37%。文章包含实战案例、训练技巧和部署方案,为计算机视觉开发者提供完整的多模态融合解决方案。

weixin_29038345的博客 292

网站打开慢,如何检查优化?

在我们使用网站过程,有时会遇到网站打开很慢,加载了好几十秒,甚至几分钟。对于新手小白来说,这件事真的很苦恼着急,又不知道如何下手。 下面就简单介绍个小技巧,却非常实用的方法:使用谷歌浏览器检查网站,排查加载慢的原因 1、首先需要下载安装谷歌浏览器,如果你已经安装了,可以进行下一步。 下载谷歌浏览器很简单,百度下谷歌浏览器,然后下载安装即可。百度谷歌浏览 2、使用谷歌浏览器打开你的网站,然后在网页的空白处,右键,然后选择【检查】 3、在弹出的检查工具栏中,选择【Network】,并勾选其中的【Disable

开源世界 429

VIPER22A实战:从零搭建15W非隔离电源,附BUCK电路调试心得

本文详细介绍了使用VIPER22A芯片从零搭建15W非隔离电源的全流程,重点解析BUCK电路设计与调试技巧。通过核心参数计算、PCB布局优化和效率提升方案,帮助工程师快速掌握DC-DC电源设计要点,实现高效稳定的电源转换。

redis7keeper的博客 671

API接口响应慢问题的快速排查与定位

在现代互联网应用中,API 接口响应慢的问题可能由多种原因引发,包括应用层问题、数据库瓶颈、缓存问题、网络延迟、服务器资源不足等。本篇文章将深入探讨 API 响应慢的常见原因,提供全面的排查思路和工具使用技巧,并结合代码实例,帮助开发者在生产环境中快速定位和解决问题。通过分析链路上的各个节点(应用层、数据库、第三方服务、缓存等)的响应时间,可以确定问题发生的具体环节。通过系统化的排查思路和合适的工具使用,开发者能够快速定位并解决线上 API 接口响应慢的问题,保障系统的稳定性和高性能。

lssffy的博客 7994

用5毫欧采样电阻实现高精度电流检测?数字可调电源控制板的硬件设计陷阱

本文深入探讨了在数字可调电源控制板设计中,如何利用5毫欧采样电阻实现高精度电流检测。从微小信号放大电路设计、采样电阻布局与热管理,到电源切换与电池管理电路优化,提供了全面的硬件设计解决方案和实用技巧,帮助工程师规避常见设计陷阱,提升系统性能。

wdx0123456的博客 1031

【提示学习代码】CoOp代码详读

CoOp是对CLIP的改进工作,主要是对prompt进行学习从而不用来手动设置prompt。自定义CLIP模型:上述两个模块结合而成的CLIP。文本编码器,接收文本的输入,并输出相应的编码表示。将图像和文本进行编码并计算它们之间的相似性。permute后变成了(4,2,3)Prompt学习器,用于学习生成提示。

weixin_51293984的博客 5817

2024年最全前端抱怨API响应慢,我们后端该做些什么?(1),Web前端事件分发机制面试

*JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串。**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式。TTFB代表第一个字节到达的时间。

2301_82243603的博客 718

IO Virtualization with Virtio.part 2 [十三]

通过对virtio_device_id 中的 device 和 vendor 的值进行比较,我们找到对应的 virtio 驱动,由于这里我们使用 i2c virtio 为例,所以调用 virtio_i2c_probe 进行 virtio i2c 设备的初始化。在和 virtio mmio 设备交互时我们会读取 VIRTIO_MMIO_DEVICE_ID 和 VIRTIO_MMIO_VENDOR_ID,并将其值写入 virtio_device_id 中,这个就会用作后面和 virtio 设备驱动的匹配参数。

cxjczy1990的博客 1212

vue 多个api请求_vue-cli3 想请求多个不同域名的接口,配置是这样吗?如果到生产环境中再该如何配置呢?...

vue-cli3 想请求多个不同域名的接口,配置是这样吗?如果到生产环境中再该如何配置呢?我的vue.config.js文件是这样配置的var webpack = require("webpack");module.exports = {publicPath: process.env.NODE_ENV === 'production' ? './' : '/',devServer: {proxy:...

weixin_42513054的博客 1547

【AutoSAR】【以太网】TCP/IP 栈详述与配置

目录 一、TCP/IP栈架构 二、TCP\IP栈的可扩展性 三、以太网协议V4 四、以太网协议 V6 五、基于IP的协议 六、函数调用序列图 一、TCP/IP栈架构 根据以上架构图,该栈主要包括:UPD\TCP\DHCP\ICMP\IPV4\IPV6\ARP; 二、TCP\IP栈的可扩展性 TCP\IP栈为适应不同的应用场景需求,将分为三类: 配置工程里的配置项: 三、以太网协议V4 1 IPV4 Internet Protocol (IP)是T.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 5697

【ROS】Nav2源码之nav2_collision_monitor(碰撞监测)详解

nav2_collision_monitor碰撞监视器是一个节点,为机器人提供了一个额外的安全级别。它使用来自传感器的数据,执行若干与避免碰撞相关的任务,绕过成本图和轨迹规划器,监测是否需要紧急停止或者减速。

郭老二 1458

C#调用IndexTTS2 REST API实现桌面端语音合成应用开发

通过C#调用本地部署的IndexTTS2 REST API,构建具备情感表达的桌面端语音合成应用。文章详解前后端通信、异步请求处理、音频播放优化及服务状态检测等实战要点,突出数据隐私、离线运行和情感控制优势,适用于对安全性与响应性能有高要求的应用场景。

weixin_42388898的博客 463

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

必备:如何中断已发出去的请求?

面试官:请求已经发出去了,如何取消掉这个已经发出去的请求? 面试者:(脑海里立马产生一个疑惑:已经发出去的请求还能取消掉?) 这个…这个…还真不知道。 面试完,马上找度娘… 推荐阅读:axios解析之cancelToken取消请求原理[2] AbortController AbortController[3] 接口表示一个控制器对象,可以根据需要终止一个或多个Web请求。 AbortController():AbortController()构造函数创建一个新的 AbortController 对象实

时清云的博客 1186

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何中断已发出去的请求?

↓推荐关注↓面试官:请求已经发出去了,如何取消掉这个已经发出去的请求?面试者:(脑海里立马产生一个疑惑:已经发出去的请求还能取消掉?) 这个......这个......还真不知道。面试完,...

小生方勤 1698

新来的后端整的 Go 接口文档看着真不优雅!

事情是这样的:今天我们公司的 Go 后端同学说他接口写完了,并分享了一个接口文档给我。用的就是 Swagger UI 自动生成的那种接口文档,就像这种:这种 Swagger UI文档我每次看着就头大,毛病多多查看多级模型时要一级级点开在接口数量变多的时候非常难用,连分类菜单都没有提交参数为 JSON 的时候不能格式化参数出错的时候查找麻烦返回结果不能折叠,长得没法看时间比...

EDDYCJY的博客 950

互联网服务端测试是个啥(入门科普)

                                互联网服务端测试是个啥(入门科普) 微博:论路痴的自我修养 啥是服务端?         一般所说的服务端是指为用户在APP或PC使用的互联网功能提供数据服务的背后的一切(你没看错,是一切)。       移动互联网时代,服务端的概念更加清晰、明确。在PC时代,大家都是浏览器浏览各种Web页,前后端分离的概念相对模糊,反正...

wangyueshu的博客 1万+

ChatGPT安卓版下载与集成指南:从官方API到私有化部署

作为一名Android开发者,想要在应用中集成ChatGPT这样的智能对话能力,听起来很酷,但实际操作起来,坑可真不少。官方应用有地区限制,直接调用API又担心配额和延迟,想在端侧跑模型还得考虑性能开销。今天,我就结合自己的踩坑经验,跟大家聊聊从下载到集成,再到深度优化的完整路线图。

2600_94960101的博客 260

Vue3 + Axios 中断请求实战:从CancelToken到AbortController的演进与应用

本文详细探讨了在Vue3项目中结合Axios实现请求中断的两种方案。从传统的CancelToken机制到现代标准的AbortController,文章通过具体场景和代码示例,阐述了如何优雅地处理用户取消、页面跳转等场景下的请求中断,以提升应用性能和用户体验。重点介绍了AbortController这一原生Web API的优势及其在Vue3中的封装实践。

t1u2v的博客 461
上一篇: 95% 的算法都是基于这 6 种算法思想
下一篇: 征服LeetCode,你的刷题之路就此开始,手把手带你了解算法奥秘
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值