对于浏览器请求接口限制,是否有必要开发一套请求任务管理器组件,自主的去控制请求的并发,保证在浏览器允许的最大并发连接数限制之中,避免请求阻塞和资源抢占。

news/2024/7/7 12:23:09/文章来源:https://www.cnblogs.com/longmo666/p/18283878

在现代Web开发中,浏览器对同时发起的网络请求确实存在一定的限制,这个限制通常与浏览器的安全性和性能优化有关。不同浏览器对最大并发连接数有不同的默认设置,例如,Chrome 和 Firefox 大致允许每个域名上同时有6到8个TCP连接,而IE可能更低。当超过这个限制时,额外的请求会被排队等待,直到有连接释放。

开发一个请求任务管理器组件来控制并发请求,可以带来以下几个优势:

  1. 避免请求阻塞:通过控制并发数,可以确保不会超出浏览器的限制,从而避免请求被不必要的延迟。

  2. 资源优化:合理分配请求,避免短时间内大量请求造成的服务器压力,以及前端资源的浪费。

  3. 错误处理和重试机制:可以集成更精细的错误处理逻辑和重试策略,比如在网络不稳定时自动重发失败的请求。

  4. 优先级管理:可以根据请求的重要性和紧急程度,调整请求的优先级,确保关键数据能更快获取。

  5. 流量控制:在高流量场景下,可以平滑地分配请求,防止瞬时高峰导致的系统崩溃。

  6. 日志和监控:可以记录请求的状态和性能指标,便于后续分析和优化。

然而,在决定是否开发这样一个组件时,也需要考虑一些因素:

  • 现有库和框架:许多流行的库和框架,如Axios、Fetch API、甚至React Query等,已经内置了并发控制和重试机制,使用这些成熟的解决方案可能比从头开始构建更高效、更稳定。

  • 维护成本:自定义实现需要持续的维护和优化,这可能会增加项目的复杂度和维护成本。

  • 团队技能和时间:如果团队对这一领域不熟悉或者项目时间紧张,可能不是最经济的选择。

  • 性能影响:虽然请求管理可以优化性能,但不恰当的实现也可能引入额外的开销,需要权衡利弊。

综上所述,是否开发请求任务管理器组件,应当基于项目需求、现有技术栈、团队能力和预期效果综合考量。
如果项目规模较大,涉及复杂的网络通信,或者有特定的性能要求,那么开发一个定制化的请求管理器可能是值得的;否则,评估和采用现有的成熟解决方案可能更为明智。

在使用 Axios 进行 HTTP 请求时,控制并发可以通过多种方式实现。这里介绍两种常见的方法:使用 Promise.all() 或者使用第三方库如 p-limit 或 axios-retry。

方法一:使用 Promise.all() 和 Promise.allSettled()

Promise.all() 可以接收一个 Promise 数组作为参数,当所有 Promise 都完成(resolve 或 reject)时返回一个包含结果的数组。但是,Promise.all() 本身并不控制并发数量,所以需要结合 Promise.allSettled() 和队列思想来控制并发。

示例代码如下:

const axios = require('axios');
const queue = [];// 假设我们有大量请求
const requests = Array.from({ length: 50 }, (_, i) => axios.get(`https://jsonplaceholder.typicode.com/posts/${i}`));// 控制并发数为5
const maxConcurrentRequests = 5;let activeRequests = 0;requests.forEach(request => {queue.push(new Promise(resolve => {if (activeRequests < maxConcurrentRequests) {activeRequests++;request.then(() => {activeRequests--;resolve();}).catch(() => {activeRequests--;resolve();});} else {resolve();}}));
});Promise.allSettled(queue).then(results => {console.log('所有请求已完成');});

方法二:使用 p-limit

p-limit 是一个轻量级的 npm 包,可以帮助你控制异步函数的并发数。使用 p-limit 的方法如下:

首先,安装 p-limit

npm install p-limit

然后,你可以像下面这样使用 p-limit

const axios = require('axios');
const pLimit = require('p-limit');// 假设我们有大量请求
const requests = Array.from({ length: 50 }, (_, i) => axios.get(`https://jsonplaceholder.typicode.com/posts/${i}`));const limit = pLimit(5); // 控制并发数为5const executeRequestsWithLimit = async () => {await Promise.all(requests.map(limit));console.log('所有请求已完成');
};executeRequestsWithLimit();

方法三:使用 axios-retry

axios-retry 是一个用于自动重试 Axios 请求的插件,虽然主要用于重试,但也可以通过调整重试策略来间接控制并发数。
然而,这并不是直接控制并发的最佳实践,因为它的主要设计目的是为了处理重试逻辑。

总之,p-limit 是控制 Axios 请求并发数的一个简单而有效的方法,而 Promise.all() 和 Promise.allSettled() 配合队列思想可以不依赖额外库实现控制并发。
选择哪种方法取决于你的具体需求和项目环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738087.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 MWC上海,“翼”彩纷呈!

2024年6月26日,2024世界移动通信大会上海(简称“MWC上海”)盛大开幕。围绕“未来先行”主题,来自全球的产业、技术和社区等各界代表齐聚一堂,共话产业高质量发展。 在“智启云领 向新未来”主题馆内,天翼云展出了“息壤”“云骁”“慧聚”三大智算平台和“天翼AI云电脑”…

Ubuntu20.04中 ORBSLAM3的安装和测试

ORBSLAM3 安装以及测试教程(Ubuntu20.04) 1.前期准备工作 1.1安装相关依赖sudo apt install git cmake gcc g++ mlocate1.2下载ORBSLAM3源码 可以直接通过github下载源码: (https://github.com/UZ-SLAMLab/ORB_SLAM3) 2.安装一些所需的库 2.1 安装Eigen3库 直接通过命令安装 su…

vue3 父组件【属性】传值给子组件【props】接收

父组件文件:parentcomponent.vue 子组件文件:childcomponent.vue传普通值 传动态值 传对象 传数组<!-- 父组件 --> <template><h1>I am ParentComponent</h1><ChildComponent msg="nice"/></template> <script setup>im…

K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

前言 Redis 是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略时,常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点,相较之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服务 进…

火山引擎数据飞轮实践:在电商场景中,如何建设全链路数据血缘?

数据作为新型生产要素,正支撑企业的数智化转型。但企业数字化建设也存在管理成本高、数据产品使用门槛高、数据资产价值不够的问题,其原因在于业务和数据之间没有形成双向良性驱动。DataLeap可以帮助企业实现数据驱动,通过具体业务中的数据消费数据,实现决策科学、行动敏捷…

IIS发布modules错误和403.14

1、解决IIS启动后报<modules>错误的方案C:\windows\system32\inetsrv\appcmd unlock config -section:system.webServer/modules参考:https://blog.csdn.net/sinat_39826352/article/details/784434322、IIS部署问题之403.14 这是因为一般情况下,IIS接受到请求后,如果…

教你5分钟完成OnlyFans注册,轻松绑卡完成订阅

OnlyFans是一个内容服务平台,内容创作者可以通过这个平台发布视频、照片、甚至直播,并设定付费墙,粉丝需支付一定费用才能解锁内容。BinGoCard可以完美解决包括OnlyFans在内的海外平台订阅问题。什么是OnlyFans? OnlyFans是一个内容服务平台,内容创作者可以通过这个平台发…

669分,武汉市第四十九中传来喜讯,璞公英「教师增值评价系统」助力学业提升!

星光熠熠,梦想启航 武汉第四十九中学传来喜讯! 高三(5)班物理类考生潘俊安同学 以总分669分的优异成绩脱颖而出! 潘俊安同学不仅实现了自我超越, 更为学校的高考历史增添了浓墨重彩的一笔。 三年磨一剑,今朝试锋芒 学霸秘诀就是它! 学霸风采:潘俊安 潘俊安:高考总分6…

(面向土木工程研究生)abaqus结构分析(免费)视频教学

土木工程专业的研究生,很多都需要做数值分析,而数值分析的平台很多人都是选择abaqus。然而,很多研究生却是从未使用过abaqus的,即,对于abaqus,他们是真正的新手,常常会“不知从何下手”!就我所知,他们可能还会遇到的另外一个困难就是“他们的导师可能完全不懂数值分析…

CentOS7修复OpenSSH漏洞升级到OpenSSH 9.8 RPM一键更新包

OpenSSH是SSH(Secure Shell)协议的开源实现,它支持在两个主机之间提供安全的加密通信,广泛用于Linux等系统,通常用于安全远程登录、远程文件传输和其它网络服务。 2024年7月1日,OpenSSH Server中存在的一个远程代码执行漏洞(CVE-2024-6387,又被称为regreSSHion)细节被…

stoi字符串转十进制数越界问题

原因 在项目开发过程中需要将字符串转化成十进制数,起初没有问题。但是在之后的开发过程中程序在运行时突然发生崩溃,由于没有做异常处理,报错信息也不明显。最后发现是因为某个字符串转化的字符串转化的十进制数超过了int的范围。 c++中各数据类型取值范围解决方法 改用sto…

C#-听说有人不推荐使用Linq!?

先说结论 linq和直接遍历的性能差异点主要还是迭代方式,数组和字符串这类的foreach都是专门有优化的,而linq都是通用的泛型调用迭代器,如果刚好遇到这类数据又需要高性能就尽量不用linq,其他类型或性能要求不高的还是linq香。(ps:linq写的不好不能怪linq) 背景 起初是看到有…

曙光服务器系统蓝屏数据恢复

一、蓝屏原因分析 首先,需要分析导致曙光服务器系统蓝屏的具体原因。蓝屏通常是由于操作系统或硬件设备驱动程序遇到致命错误所致。可能的原因包括软件冲突、硬件故障(如内存条问题、硬盘故障)、驱动程序过时或不兼容等。 二、安全措施 在进行数据恢复之前,务必确保服务器的…

服务器存储金蝶数据库丢失恢复

一、检查备份情况 确认备份存在: 首先,需要确认是否有金蝶数据库的备份存在。备份是数据恢复的基础,没有备份的情况下恢复数据将非常困难。 检查备份的完整性和时效性: 验证备份文件的完整性和时效性,确保备份文件没有损坏且包含丢失数据之前的数据库状态。二、使用备份恢…

威联通NAS维修

涉及多个方面,包括硬件故障维修、数据恢复等。 一、维修内容 硬件故障维修: 针对威联通NAS出现的各种硬件故障,如电源故障、主板故障、硬盘故障等,提供检测和维修。 在维修过程中,会仔细检查每个部件,确保找到故障根源并进行修复。 数据恢复: 当威联通NAS中的数据因硬盘…

Fastapi 脚本接口规范优化

Fastapi 脚本接口规范优化 在编写Fastapi脚本提供自动化接口操作时,我们不仅要实现接口功能实用性,也要考虑接口的规范管理,这边以Fastapi官方文档作为一个切入点。 官方接口文档 默认官方接口文档如下图所示,宛如大杂烩一样 /doc接口文档 /redoc接口文档 优化方案 1、根据…

面试官:Java类是如何被加载到内存中的?

类的生命周期都有哪些阶段?类加载的过程是怎样的?面试连环callJava类是如何被加载到内存中的? Java类的生命周期都有哪些阶段? JVM加载的class文件都有哪些来源? JVM在加载class文件时,何时判断class文件的格式是否符合要求?类生命周期 一个类从被加载到虚拟机内存开始,…

招募贴 | 第四期自动驾驶OS开发初阶营报名开启

招募贴 | 第四期自动驾驶OS开发初阶营报名开启 第四期国家智能网联汽车创新中心自动驾驶OS开发初阶训练营将于2024年7月22日开营,现已开启报名,诚邀对自动驾驶底层软件开发感兴趣的学员加入,一起驶入自动驾驶的快车道,共同探索未来的无限可能。从训练营能学到什么? 训练营…

STM32L073RZT 调试SPI问题

现象描述: spi通信一次后,第二次通信spi的SR寄存器异常0xFF31(MODF, CRCERR, RXNE),通信失败。 以下为调用流程及相关代码:NFC_ID(); NFC_REG_B_TEST();//SPI 读 void SPI_Read_Data(uint8_t* w_data, uint32_t w_size, uint8_t* r_data, uint32_t r_size) {SET_SPI_CSS(G…

Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享

本书从一个系统化的视角,秉承大道至简的主导思想,介绍Spark中最值得关注的内 容,讲解Spark部署、开发实战,并结合Spark的运行机制及拓展,帮读者开启Spark技术之旅。 Spark大数据处理:技术、应用与性能优化(全)PDF下载 Spark已经在全球范围内广泛使用,无论是Intel、Yahoo…