作为一名前端工程师,该如何控制高并发请求呢?「如果有更好的方案,欢迎讨论」

news2024/9/24 7:17:55

假如现在有几十、上百个请求,我们该如何去控制这么高的并发呢?

给你一分钟时间,稍作思考 ~ 🤔

此场景有很多,比如 图片或文件批量下载、RSSHub高速抓取内容。。。

第一想法是不是请求池!!! 没错, 利用Promise模拟任务队列,从而实现请求池效果。

正文

众所周知,浏览器发起的请求最大并发数量一般都是 6~8 个,这是因为浏览器会限制同一域名下的并发请求数量,以避免对服务器造成过大的压力。

👇 先来模拟一下同时发起大量请求

// 模拟大量请求的函数
async function simulateConcurrentRequests(url, numberOfRequests) {
    const requests = Array.from({ length: numberOfRequests }, () => fetch(url));

    try {
        const responses = await Promise.all(requests);
        const results = await Promise.all(responses.map(response => response.json()));
        return results;
    } catch (error) {
        console.error('One or more requests failed:', error);
        return [];
    }
}

// 使用示例
const url = 'https://jsonplaceholder.typicode.com/posts/1'; // 示例URL
const numberOfRequests = 100; // 请求数量

simulateConcurrentRequests(url, numberOfRequests)
    .then(results => {
        console.log('All requests completed. Results:', results);
    })
    .catch(error => {
        console.error('Error during requests:', error);
    });
    

👇 效果如下:

在这里插入图片描述
一次性并发上百个请求,要是配置低一点,又或者带宽不够的服务器,直接宕机都有可能,所以我们前端这边是需要控制的并发数量去为服务器排忧解难「这样才能突出前端的高级」

首先 什么是队列?

先进先出就是队列push 一个的同时就会有一个被 shift。我们看下面的动图可能就会更加的理解:

在这里插入图片描述

我们了解了什么是队列,就可以模拟上图的队列行为来实现请求池。

1️⃣ 定义请求池函数,用于控制并发请求数量

// 基于队列控制并发请求数量
async function fetchWithConcurrency(url, totalRequests, maxConcurrency) {
    const results = [];
    let activeRequests = 0;
    let currentIndex = 0;

    async function fetchTask() {
        if (currentIndex >= totalRequests) return;

        const taskIndex = currentIndex++;
        activeRequests++;

        try {
            const response = await fetch(url);
            const data = await response.json();
            results[taskIndex] = data;
        } catch (error) {
            console.error('Request failed:', error);
            results[taskIndex] = null;
        } finally {
            activeRequests--;
            if (currentIndex < totalRequests) {
                await fetchTask();
            }
        }
    }

    const initialTasks = Array.from({ length: maxConcurrency }, fetchTask);
    await Promise.all(initialTasks);

    return results;
}

// 使用示例
const url = 'https://jsonplaceholder.typicode.com/posts/1'; // 示例URL
const totalRequests = 100; // 请求数量
const maxConcurrency = 10; // 并发请求数量限制

fetchWithConcurrency(url, totalRequests, maxConcurrency)
    .then(results => {
        console.log('All requests completed. Results:', results);
    })
    .catch(error => {
        console.error('Error during requests:', error);
    });
代码解释
  1. fetchWithConcurrency 函数:用于控制并发请求数量,接收三个参数:

    • url: 请求的URL。
    • totalRequests: 总请求数量。
    • maxConcurrency: 最大并发请求数量。
  2. 状态变量:

    let activeRequests = 0;
    let currentIndex = 0;
    

    用于跟踪当前活跃的请求数量和当前要处理的请求索引。

  3. fetchTask函数:负责处理单个请求任务。

    async function fetchTask() {
        if (currentIndex >= totalRequests) return;
    
        const taskIndex = currentIndex++;
        activeRequests++;
    
        try {
            const response = await fetch(url);
            const data = await response.json();
            results[taskIndex] = data;
        } catch (error) {
            console.error('Request failed:', error);
            results[taskIndex] = null;
        } finally {
            activeRequests--;
            if (currentIndex < totalRequests) {
                await fetchTask();
            }
        }
    }
    
    
    • 如果当前索引超过总请求数,任务结束。
    • 增加当前索引并增加活跃请求计数。
    • 发送请求并处理响应。
    • 无论请求成功与否,最终减少活跃请求计数,并检查是否需要处理下一个请求。
  4. 启动初始任务:

    const initialTasks = Array.from({ length: maxConcurrency }, fetchTask);
    await Promise.all(initialTasks);
    

    创建一个数组,长度为最大并发数,并启动相应数量的初始任务。使用 Promise.all 等待所有初始任务完成。

2️⃣ 测试

这种方法确保了在任何时间点,最多只有 maxConcurrency 个请求正在进行,从而实现真正的并发控制。

在这里插入图片描述
可以看出,请求数确实被控制了,只有有请求响应成功的同时才会有新的请求进来,极大的降低里服务器的压力,后端的同学都只能😲惊呼 6️⃣ 6️⃣ 6️⃣

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LaTex】11 ACM参考文献顺序引用 - 解决 ACM-Reference-Format 顺序不符合论文实际引用顺序的问题

【LaTex】11 ACM参考文献顺序引用 写在最前面解决 ACM-Reference-Format 顺序不符合论文实际引用顺序的问题问题描述问题原因如何解决问题解决方案1&#xff08;更简单&#xff09;解决方案2&#xff08;更自由&#xff09; 小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 …

AutoDL搭建 ChatGLM3

租用新实例 这里选择的西北 B 区、RTX 409024GB 创建虚拟环境并激活 # 安装虚拟环境至数据盘 conda create --prefix /root/autodl-tmp/envs/chatglm3-demo python3.10# 激活虚拟环境 conda activate /root/autodl-tmp/envs/chatglm3-demo拉取ChatGLM3仓库代码 # 开启学术…

科学提效|AI融入零售业,未来零售的创新之旅

零售业正经历着由人工智能&#xff08;AI&#xff09;引领的转型浪潮。AI在零售和消费品&#xff08;CPG&#xff09;行业的应用前景广阔&#xff0c;它正以多种创新方式重塑行业的运作模式。且随着技术的不断进步&#xff0c;AI在零售业的应用将变得更加广泛和深入。AI不仅能够…

聊天宝使用技巧揭秘让您快捷回复效率翻倍

聊天宝快捷回复软件&#xff0c;推出大量实用工具&#xff0c;帮助客服能更加高效的实现快捷发送&#xff0c;一键发送&#xff0c;效果翻倍&#xff01; ​ 前言 聊天宝作为一款快捷回复工具&#xff0c;让客服免去了打字回复之苦。所以很受广大客服欢迎&#xff0c;真是一旦…

数控六面钻选购指南:如何挑选一款高效、精准的加工利器?

在木工家具、门窗制造等行业中&#xff0c;数控六面钻凭借其高效、精准的特点&#xff0c;逐渐成为现代生产线上的必备设备。然而&#xff0c;市场上的数控六面钻品牌众多&#xff0c;性能各异&#xff0c;如何选购一款适合自己的设备呢&#xff1f;本文将为您提供一份实用的选…

aws lakeformation工作流程和权限管理逻辑

lakeformation在IAM权限模型之外提供独立的更细粒度的权限&#xff0c;控制数据湖数据的访问 能够提供列、行和单元格级别的精细控制 lakeformation的目的是要取代s3和iam策略&#xff0c;主要功能为 数据摄入&#xff0c;LF可以将不同类型的数据统一管理安全管理&#xff0…

前端面试问题:子组件的某一个方法调用执行逻辑由父组件的属性状态变化来决定

面试官&#xff1a;请你讲讲你在该项目中遇到的问题是什么&#xff1f;你怎么解决这个问题&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路…

B站pink老师CSS学习(一)

文章目录 一、CSS基础选择器1.标签选择器2.类选择器3. id选择器4.通配符选择器 二、字体属性1.字体2.字体大小3.字体粗细4.文字样式5.复合属性 三、文本属性1.文本颜色2.对齐文本3.装饰文本4.文本缩进5.行间距 四、CSS引入方式1. 内部样式表2.行内样式表3.外部样式表 一、CSS基…

uni微信小程序input框过滤中文字节以及规定以外的符号

问题描述 需求是输入账号只能为手机号、邮箱、字母和数字组成的字符串&#xff0c;那么就是所有大小写字母、数字、以及符号 - _ . 四种。 条件限制 微信小程序无法直接通过type属性实现&#xff0c;type属性中没有专门为只允许英文字母的输入类型。详情见input | uni-ap…

服务器上创建搭建gitlab

一、下载与安装 在主目录操作~ 1.使用wget下载 wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.0.1-ce.0.el7.x86_64.rpm 可以在开源软件镜像站选择合适的版本&#xff0c;版本不同页面菜单会稍有差异&#xff0c;此次选…

Redis解决缓存一致性问题

文章目录 ☃️概述☃️数据库和缓存不一致采用什么方案☃️代码实现☃️其他 ☃️概述 由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是: 用户使用缓存中的过…

Python的selenium爬取

1.selenium 1.1.前言 使用python的requests模块还是存在很大的局限性&#xff0c;例如&#xff1a;只发一次请求&#xff1b;针对ajax动态加载的网页则无法获取数据等等问题。特此&#xff0c;本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。 1.2.什么是seleniu…

Redis 主从搭建简单教程

安装单机 首先拿到安装包 wget https://download.redis.io/releases/redis-7.0.15.tar.gz然后进行解压 tar -zxvf redis-7.0.15.tar.gz 然后创建一个文件夹myredis将原始配置文件进行备份 mkdir /myrediscp redis.conf /myredis/redis7.conf 将配置文件复制进去 最后使用vim编…

深入Java:JSON解析与操作的艺术

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、初识JSON&#xff1a;数据格式的优雅舞者 在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;以其轻量级和易于阅读的特点成为了数据交换的首选格式。它基于JavaScript的一个…

Python教程:使用Python和PyQt编写进制转换器工具

1.介绍 在现代计算中&#xff0c;进制转换是一项常见且重要的任务。为了简化这个过程&#xff0c;我们也可以利用Python和PyQt自己写一个直观且易于使用的进制转换器工具。这个工具将支持二进制、八进制、十进制和十六进制的相互转换&#xff0c;并提供良好的用户界面和交互体…

finetuning大模型准备(基于Mac环境)

为finetuning进行的热身准备&#xff0c;涉及周边的软件工具&#xff0c;方法。 问题1&#xff1a;finetuning过程较长&#xff0c;采用系统自带命令行没有后台&#xff0c;前台被杀后&#xff0c;容易造成训练失败。 解决方法&#xff1a; tmux可以开启后台训练 问题2&…

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 今天&#xff0c;我们继续了解下来自清华大学发布的两种参数高效微调方法P-Tuning和P-Tuning v2。可以简单的将P-Tuning是认为针对Prompt Tuning的改进…

P9 【力扣+知识点】【算法】【二分查找】C++版

【704】二分查找&#xff08;模板题&#xff09;看到复杂度logN&#xff0c;得想到二分 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0…

“揭秘:为什么羊驼Ollama成为计算机运行大型语言模型的最佳拍档?“

最近&#xff0c;AIM 评测了在计算机上本地运行大语言模型&#xff08;LLM&#xff09;的最佳工具&#xff0c;Ollama 脱颖而出&#xff0c;成为最高效的解决方案&#xff0c;提供了无与伦比的灵活性。Ollama 是 Jeffrey Morgan 开发的一款开源工具&#xff0c;它正在彻底改变爱…

网络渗透day2

Windows登录的明文密码存储过程和密文存储位置 明文密码存储过程&#xff1a; Windows操作系统不会以明文形式存储用户密码。相反&#xff0c;当用户设置或更改密码时&#xff0c;系统会对密码进行哈希处理&#xff0c;然后存储其哈希值。哈希处理的目的是为了提高密码的安全性…