前端高并发的出现场景及解决方法——技能提升——p-limit的使用

ops/2024/9/23 12:20:46/

最近在写后台管理系统的时候,遇到一个场景,就是打印的页面需要根据传入的多个id,分别去请求详情接口。

比如id有10个,则需要调用10次详情接口获取到数据,最后对所有的数据进行整合后页面渲染。

相信大家或多或少都遇到过前端高并发的场景,需要发送大量的http请求,如果直接将所有的请求都放入浏览器queue中排队的话,势必会造成浏览器卡顿或者崩溃,这时候就需要一种机制来做控制。

在这里插入图片描述
下面介绍两种方法来处理高并发的场景:

图中的详情id是从链接路由上拿到的,

const id = this.$route.query.id;
this.pageIds = id.split(',');

接口定义的方法:通过async异步处理接口,这样实现异步同时请求接口

export async function getProSendOutSheets(id) {return request(`/api/production-service/proSendOutSheets/${id}`, METHOD.GET);
}

解决方法1:通过async await串行处理

async getProSendList(){let listDB = [];for(let i in this.pageIds){await getProSendOutSheets(this.pageIds[i]).then(res=>{if(res.success){let db = res.data;list.push(db);}})}//此处的listDB就是最后整合的数据
}

下面找了网上的一个同样串行处理的效果图:
在这里插入图片描述

从图中可以看出请求是一条发送完成才会接着下一条发送,上面的时间看板显示请求是在一条线上的,因为用了keep-alive,复用同一条TCP链接,超长的 stalled 已经不存在了,但是这么请求的效率显然太慢了

解决方法2:并发控制——使用p-limit插件

npm install p-limit

使用方法如下:

import PLimit from 'p-limit'// 限制五条并发
const pLimit = PLimit(5)
async getProSendList(){let listDB = [];for(let i in this.pageIds){listDB.push(pLimit(getProSendOutSheets(this.pageIds[i]).then(res=>{if(res.success){let db = res.data;return db;}})))}await Promise.all(listDB);//此处的listDB就是最后整合的数据
}

在这里插入图片描述
至此达到我们最终想要的效果,一个可控的并发请求,即能控制并发数也不会出现超长的 stalled 阻塞后续请求

总结:

高并发请求不做限制时,会导致后续请求阻塞,甚至浏览器卡顿或崩溃
解决方法1、串行逐条发送,并发请求慢,整体耗时太长
解决方法2、并发控制,目前较好的处理方式

多多积累,多多收获!!!


http://www.ppmy.cn/ops/28122.html

相关文章

Grafana页面嵌入自建Web应用页面

目录 一、应用场景 二、实现方式 1、修改Grafana配置文件 2、获取监控页面url 3、隐藏左侧和顶部菜单 一、应用场景 需要将Grafana监控页面嵌入自建Web应用页面,使Grafana监控页面成为自建Web应用的一部分。 二、实现方式 总体思路:修改Grafana配…

Windows系统下安装Mosquitto的步骤(4)

接前一篇文章:Windows系统下安装Mosquitto的步骤(3) 本文内容参考: Windows下搭建MQTT服务器_mqtt服务器软件-CSDN博客 特此致谢! 上一回讲解了Mosquitto的配置,经过配置步骤后,大的功能有了并…

基于ssm+vue+Mysql的药源购物网站

开发语言:Java框架:ssmJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.…

Xcode安装与配置

Xcode的安装步骤通常包括从Mac App Store下载Xcode、安装Xcode、启动并配置Xcode等。具体如下: 下载安装:前往Mac App Store,搜索Xcode并下载。由于Xcode体积较大,下载可能需要一些时间。安装:下载完成后,…

MATLAB初学者入门(30)—— 数据库开发

在MATLAB中实现数据库开发涉及连接数据库、执行SQL查询、处理查询结果以及将数据用于分析和可视化。MATLAB提供了数据库工具箱,该工具箱支持与多种数据库系统的连接,包括但不限于MySQL、Oracle、SQL Server、PostgreSQL等。 案例分析:使用MA…

【PCL】教程 example2 3D点云之间的精确配准(FPFH特征对应关系估计变换矩阵)

这段代码主要实现了点云之间的配准功能,旨在通过估计点云的特征并找到最佳的对应关系来计算一个变换矩阵,从而可以将源点云(src)变换到目标点云(tgt)的坐标系统中。 代码功能和方法总结如下: 估…

高速收发器(GTX)文章导航

关于FPGA的开发,大致可以分为算法和接口两类,其中接口又可以分为高速和低速两类,像UART、I2C、SPI、SDRAM、HDMI、LVDS等等,都被归为低速接口类别,最高线速率不过几百Mbps,使用FPGA的普通IO即可实现数据收发…

React Router的使用

React Router 是 React 项目的路由库,使用很方便,也是 React 前端项目的主要功能库之一。这里的路由指的是客户端的路由,在客户端路由时,浏览器是不会发送页面请求的,只会发送数据请求。 安装依赖 npm install react…