首页 > 其他分享 >【开发】若页面一次性接口请求上百个,阁下又当如何应对

【开发】若页面一次性接口请求上百个,阁下又当如何应对

时间:2024-11-15 10:46:16浏览次数:1  
标签:queue const 请求 res 阁下 current 并发 百个 页面

需求:假如页面一次性请求有上百个,你应该如何处理这种请求并发?

答:so easy!循环请求?肯定是不对的,否则一次性并发上百次请求,差点的服务器得崩溃了,我甚至一度以为你是在搞Dos攻击。我们可以通过任务队列的缓存来合理控制并发数据。

我们知道浏览器发起的请求最大并发数量一般都是 6~8 个,这是因为浏览器会限制同一域名下的并发请求数量,以避免对服务器造成过大的压力。本文思路的核心就是保持浏览器的最大并发请求,多出的请求数加入队列缓存。

1. 实现并发请求场景

我们现实一下简单的100次直接并发请求的场景,本地实现一个简单的前端页面和express后台服务:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./axios.min.js"></script>
</head>
<body>  
</body>

<script>
  // 请求模拟
  const requestFn = () => {
    return axios.get("http://127.0.0.1:8000/msg", {})
  }
  // 模拟直接并发100次请求
  for (let i = 0; i < 100; i++) {
    requestFn();
  }
</script>
</html>

const express = require('express');
const app = express();

app.all('*', (req,res,next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Credentials", true);
  next();
})

app.get("/msg", (req, res) => {
  let count = 0;
  for (let i = 0; i < 10000000; i++) {
    count++
  }
  res.json({code :0, msg: `请求结果${count}`});
})

app.listen('8000',() => {
  console.log('请求成功')
})

一次性并发上百个请求,要是配置低一点,又或者带宽不够的服务器,直接宕机都有可能,所以我们前端这边是需要控制的并发数量去为服务器排忧解难。

2. 优化并发请求场景

如下所示,定义一个 queue 用来缓存请求队列,定义一个参数 current 记录当前正常并发执行的接口请求数量。每一次循环请求时都会先将请求接口缓存在队列queue中,当前的并发的请求数量 current 小于默认最大的请求限制数量 limitCount时候,从队列头部中选择一个请求并开始执行,并且 current 数量+1,执行完成后current 数量-1,并且继续递归执行。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./axios.min.js"></script>
</head>
<body>  
</body>

<script>
  // 请求模拟
  const requestFn = () => {
    return axios.get("http://127.0.0.1:8000/msg", {})
  }
  // 实现一个并发控制的函数
  const queue = [] // 请求池队列,用来缓存接口请求
  let current = 0
  const requestQueue = (limitCount = 6, callbackFn) => {
    queue.push(callbackFn); // 入队列
    const dequeue = () => {
      while (current < limitCount && queue.length) {
        current++;
        const requestPromiseFactory = queue.shift() // 出列
        requestPromiseFactory()
          .then((res) => { 
            console.log('res =====>', res)
          })
          .catch(error => { // 失败
            console.log(error)
          })
          .finally(() => {
            current--
            dequeue()
          });
      }
    }
    // 执行
    dequeue()
  }

  for (let i = 0; i < 100; i++) {
    requestQueue(6, requestFn)
  }
</script>
</html>

文章出自:https://juejin.cn/post/7360970130912411711

作者:阿镇吃橙子

标签:queue,const,请求,res,阁下,current,并发,百个,页面
From: https://www.cnblogs.com/o-O-oO/p/18546567

相关文章

  • SharePoint Online页面的一些奇怪参数
    前言最近,在查找资料的时候,偶然间发现了一些非常有意思的参数,如下:?env=Embedded or ?env=WebView&wdStartOn=21.正经的SharePointOnline页面2.加了参数的SharePointOnline页面3.加了另一个参数的SharePointOnline页面结束语......
  • uniapp路由与页面跳转详解:API调用与Navigator组件实战
    UniApp路由与页面跳转详解:API调用与Navigator组件实战路由uniapp页面路由为框架统一管理,开发者需要在page.json里面配置每个路由页面的路径及页面样式。路由跳转uniapp有两种页面路由跳转方式,调用API跳转和navigator组件跳转。调用API跳转navTo(){ /*跳转到非tabbar......
  • flutter TabBarView 动态添加删除页面
    在TabBarView动态添加页面后删除其中一个页面会导致后面的页面状态错误或删除的页面不正确。出现这种问题是由于创建子页面时没有为子页面设置唯一的key导致的。1voidaddNewPage(){2_pageCount++;3setState((){4Stringtitle="页面$_pageCount......
  • uni-app使用watch监听数据,当数据变化时页面没有根据变化数据渲染解决方法
    uni-app使用<Fudian:fenshuj="fenshuj"></Fudian>父传子数据时,子组件通过import{ref,onMounted,watch,watchEffect,defineProps}from"vue";   constprops=defineProps({      fenshuj:{         type:String,        ......
  • vue项目部署后刷新页面404的原因和解决方案
     一、这是为什么,我们先来了解下vue路由两种模式的区别。newRouter({mode:'hash',//historyroutes:[],...})1.hash模式(默认)的访问URL中有#字符,history模式的URL没有带#,外观上history模式比hash模式好看些;2.hash模式通过监听浏览器的onhashchange()......
  • 鸿蒙开发实战:鸿蒙应用开发中的页面管理工具类详解
    一、引言在鸿蒙应用开发的征程中,如何高效地管理页面布局与显示,以满足用户对于沉浸式体验、个性化StatusBar颜色等界面特性的需求,一直是开发者们关注的焦点。为此,我特别设计了一款实用的“页面管理工具类”,它具备强大的功能,能帮助开发者轻松应对各种页面管理挑战。二、页面管理......
  • 连接数据库实现页面的增删改查
    创建项目,选择maven为构建系统在pom.xml文件中添加war包在idea创建web项目并修改路径为src\main\webapp再配置tomcat以下是项目的类和文件1.配置pom.xml文件将需要用的配置文件都导进去点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://m......
  • Vue网站发布到iis后提示404页面不可访问
    vue重定向和跨域配置:https://zhuanlan.zhihu.com/p/5306882511.安装组件:URLRewrite:https://www.iis.net/downloads/microsoft/url-rewriteApplicationRequestRouting:https://www.iis.net/downloads/microsoft/application-request-routing2.新建一个web.config放到发布到文件......
  • RadSystems 自定义页面全攻略:个性化任务管理系统的实战设计
    系列文章目录探索RadSystems:低代码开发的新选择(一)......
  • github action自动部署angular页面
    angular.jsonprojects>{your-project-name}>architect>build>options>outputPath如果默认生成静态网页在browser下,记得修改/添加属性"baseHref":"/browser/",安装angular-cli-ghpagesngaddangular-cli-ghpages.github/workflows下创建工作流nam......