假如有几十个请求,如何去控制并发?

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

const ids = new Array(100).fill('')

console.time()
for (let i = 0; i < ids.length; i++) {
  console.log(i)
}
console.timeEnd()

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

什么是队列?

先进先出就是队列,push一个的同时就会有一个被shift

定义请求池主函数函数
export const handQueue = (  
  reqs // 请求数量
) => {}

接受一个参数reqs,它是一个数组,包含需要发送的请求。函数的主要目的是对这些请求进行队列管理,确保并发请求的数量不会超过设定的上限。

定义dequeue函数
const dequeue = () => {  
  while (current < concurrency && queue.length) {  
    current++;  
    const requestPromiseFactory = queue.shift() // 出列  
    requestPromiseFactory()  
      .then(() => { // 成功的请求逻辑  
      })  
      .catch(error => { // 失败  
        console.log(error)  
      })  
      .finally(() => {  
        current--  
        dequeue()  
      });  
  }  
}

 

这个函数用于从请求池中取出请求并发送。它在一个循环中运行,直到当前并发请求数current达到最大并发数concurrency或请求池queue为空。对于每个出队的请求,它首先增加current的值,然后调用请求函数requestPromiseFactory来发送请求。当请求完成(无论成功还是失败)后,它会减少current的值并再次调用dequeue,以便处理下一个请求。

定义返回请求入队函数
return (requestPromiseFactory) => {  
  queue.push(requestPromiseFactory) // 入队  
  dequeue()  
}

函数返回一个函数,这个函数接受一个参数requestPromiseFactory,表示一个返回Promise的请求工厂函数。这个返回的函数将请求工厂函数加入请求池queue,并调用dequeue来尝试发送新的请求,当然也可以自定义axios,利用Promise.all统一处理返回后的结果。

整合代码
import axios from 'axios'

export const handQueue = (
  reqs // 请求总数
) => {
  reqs = reqs || []


  const requestQueue = (concurrency) => {
    concurrency = concurrency || 6 // 最大并发数
    const queue = [] // 请求池
    let current = 0

    const dequeue = () => {
      while (current < concurrency && queue.length) {
        current++;
        const requestPromiseFactory = queue.shift() // 出列
        requestPromiseFactory()
          .then(() => { // 成功的请求逻辑
          })
          .catch(error => { // 失败
            console.log(error)
          })
          .finally(() => {
            current--
            dequeue()
          });
      }

    }

    return (requestPromiseFactory) => {
      queue.push(requestPromiseFactory) // 入队
      dequeue()
    }

  }

  const enqueue = requestQueue(6)

  for (let i = 0; i < reqs.length; i++) {

    enqueue(() => axios.get('/api/test' + i))
  }
}

对于一个页面包含多个异步请求的接口,进行性能测试时可以采取以下步骤: 1. 确定性能测试的目标和指标:明确需要测试的性能指标,例如响应时间、吞吐量、并发用户数等。 2. 制定性能测试计划:根据页面中的异步请求接口,制定测试计划,包括测试的范围、测试的时间段和持续时间等。 3. 设置测试环境:搭建适合进行性能测试的测试环境,包括服务器、网络等,并确保环境的稳定性和准确性。 4. 编写性能测试脚本:根据页面中的异步请求接口,编写性能测试脚本,模拟多个并发用户同时访问这些接口。 5. 进行负载测试:使用性能测试工具,例如JMeter或LoadRunner,进行负载测试,模拟多个并发用户同时访问页面中的异步请求接口。 6. 监控和分析结果:监控性能测试过程中的各项指标,例如响应时间、服务器资源利用率等,并进行结果分析,找出性能瓶颈和优化建议。 7. 优化和再测试:根据性能测试结果分析,针对性能瓶颈进行优化,并进行再次性能测试,以验证优化效果。 8. 生成性能测试报告:根据性能测试结果和分析,生成性能测试报告,记录测试过程、结果和优化建议,供开发团队参考。 在进行性能测试时,还需要注意以下几点: - 确保测试环境与实际生产环境尽可能接近,以保证测试结果的可靠性。 - 针对不同的异步请求接口设置适当的并发用户数,并调整模拟用户的行为和负载情况,以模拟真实的用户场景。 - 监控服务器资源的使用情况,例如CPU、内存、网络带宽等,确保服务器能够承受测试负载。 - 进行多次测试,并取多次测试结果的平均值,以获得更准确的性能指标。 - 定期进行性能测试,以便及时发现和解决潜在的性能问题。 通过以上步骤和注意事项,您可以对页面中包含多个异步请求接口进行有效的性能测试,并找出性能瓶颈和优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值