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

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

时间:2024-07-04 15:09:37浏览次数:17  
标签:axios 浏览器 请求 并发 limit Promise const

在现代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); // 控制并发数为5

const executeRequestsWithLimit = async () => {
  await Promise.all(requests.map(limit));
  console.log('所有请求已完成');
};

executeRequestsWithLimit();

方法三:使用 axios-retry

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

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

标签:axios,浏览器,请求,并发,limit,Promise,const
From: https://www.cnblogs.com/longmo666/p/18283878

相关文章

  • 多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步
    多线程编程在现代计算机系统中非常重要,因为它能够使程序同时执行多个操作,提高计算效率。以下是多线程编程的基本概念及如何在C++标准库中使用std::thread和std::async进行多线程编程,同时处理线程同步和并发问题。多线程编程的基本概念线程(Thread):线程是一个轻量级的进程,是......
  • 前端Ajax中请求数据中body和query传参的方法
    一、post请求可以传body和query两种形式的参数:【body传参】:$.ajax({type:"POST",url:"xxxxxxxxxxxxxx",data:{ids:tempID}...})【body传参,当要求传JSON字符串格式的参数时】:$.ajax({type:"POST",url:"xxxxxxxxxxxx......
  • 高并发场景下的热点key问题探析与应对策略
    目录一、问题描述二、发现机制三、解决策略分析 (一)解决策略一:多级缓存策略客户端本地缓存代理节点本地缓存 (二)解决策略二:多副本策略 (三)解决策略三:热点Key拆分与动态分散四、总结干货分享,感谢您的阅读!在高并发场景下,缓存作为前置查询机制,显著减轻了数据库的压......
  • 设置谷歌浏览器禁止打开某网页csdn
    设置谷歌浏览器禁止打开某网页的方法包括使用浏览器设置和网络过滤软件。‌使用浏览器设置禁止访问网站在GoogleChrome浏览器中,‌可以通过以下步骤禁止访问特定的网站:‌打开Chrome浏览器,‌点击右上角的三个点菜单按钮,‌选择“设置”。‌在左侧菜单栏中选择“隐私和安全”,......
  • Web请求过程
            重点:需要理解从用户在浏览器点击一条链接开始,到我们的服务器返回结果给浏览器,中间发生了哪些过程,需要哪些技术.概述    互联网的网络架构已从传统的C/S架构转变为了B/S架构.    B/S架构的优点:客户端:使用统一的浏览器(Browser),使......
  • MySQL-16.MVCC(多版本并发控制)
    C-16.多版本并发控制1.什么是MVCCMVCC(MultiversionConcurrencyControl),多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一事务更新的行,并且......
  • 如何从零搭建10万级 QPS 大流量、高并发优惠券系统
    需求背景春节活动中,多个业务方都有发放优惠券的需求,且对发券的QPS量级有明确的需求。所有的优惠券发放、核销、查询都需要一个新系统来承载。因此,我们需要设计、开发一个能够支持十万级QPS的券系统,并且对优惠券完整的生命周期进行维护。需求拆解及技术选型需求拆解要配置......
  • uniapp和flask实现跨域请求
      新书上架~......
  • 1s内控制向某个请求请求的次数
    背景有的时候后端提供的接口对相同的IP进行限制,在某个时间内不能发送超过X条的请求,一旦超过指定的请求数会导致后续请求接口会出现异常。效果需求比如:在1s内最多同时发送2个请求,多出来的请求在后续的1s或者后续的Ns中发起代码<template><divclass="app"><el-divid......
  • 什么是 HTTP Range请求(范围请求)
    HTTPRange请求,也称为范围请求,是一种HTTP协议的功能,它允许客户端请求服务器发送一个资源的一部分,而不是整个资源。这种请求通常用于处理大文件的下载或流媒体服务,尤其是在网络不稳定或需要断点续传的场景中非常有用。范围请求的基本语法如下:Range:bytes=<start_byte>-<end_b......