当前位置: 首页 > news >正文

前端限流如何实现,如何防止服务器过载

前端限流是一种控制请求频率的技术,旨在防止过多的请求在同一时间段内发送到服务器,避免造成服务器过载或触发反爬虫机制。实现前端限流的方法有很多,下面介绍几种常见的策略和技术:

1. 时间窗口算法

时间窗口算法是最简单的限流方式之一,它基于固定的时间间隔来限制请求数量。

let lastRequestTime = 0;
const REQUEST_INTERVAL = 500; // 请求间隔为500毫秒function makeRequest(data) {const now = new Date().getTime();if (now - lastRequestTime > REQUEST_INTERVAL) {lastRequestTime = now;// 发起实际的网络请求console.log('发起请求:', data);} else {console.log('请求过于频繁,请稍后再试');}
}

2. 漏桶算法

漏桶算法将所有请求放入一个“桶”中,并以固定的速率处理这些请求。如果桶满了,新的请求就会被拒绝或者排队等待。

class LeakyBucket {constructor(rate, capacity) {this.rate = rate; // 处理速度(每毫秒处理多少个请求)this.capacity = capacity; // 桶的最大容量this.waterAmount = 0; // 当前水量this.lastLeakTimestamp = Date.now(); // 上次漏水的时间戳}canMakeRequest() {const now = Date.now();const elapsedTime = now - this.lastLeakTimestamp;const leakedAmount = elapsedTime * this.rate;// 更新当前水量this.waterAmount = Math.max(0, this.waterAmount - leakedAmount);this.lastLeakTimestamp = now;if (this.waterAmount < this.capacity) {this.waterAmount += 1;return true;} else {return false;}}
}const bucket = new LeakyBucket(0.1, 10); // 设置每毫秒处理0.1个请求,最大容量为10function makeRequest(data) {if (bucket.canMakeRequest()) {// 发起实际的网络请求console.log('发起请求:', data);} else {console.log('请求过于频繁,请稍后再试');}
}

3. 计数器算法

计数器算法通过记录一段时间内的请求数量来进行限流。当达到设定的最大请求数时,在剩余时间内不再接受新的请求。

let requestCount = 0;
const MAX_REQUESTS = 5; // 最大请求数
const TIME_WINDOW = 1000; // 时间窗口大小为1秒function resetCounter() {setTimeout(() => {requestCount = 0;}, TIME_WINDOW);
}function makeRequest(data) {if (requestCount < MAX_REQUESTS) {requestCount++;// 发起实际的网络请求console.log('发起请求:', data);if (requestCount === 1) { // 第一次请求时重置计数器resetCounter();}} else {console.log('请求过于频繁,请稍后再试');}
}

4. 使用第三方库

对于更复杂的场景,可以考虑使用现成的限流库,如 bottlenecklimiter,它们提供了更多高级功能和配置选项。

例如,使用 bottleneck

首先安装依赖:

npm install bottleneck

然后在代码中使用:

const Bottleneck = require("bottleneck");// 创建一个限流器,每秒最多允许5个请求
const limiter = new Bottleneck({maxConcurrent: 1,minTime: 200 // 每200ms允许一个新的请求
});async function makeRequest(data) {await limiter.schedule(() => {// 发起实际的网络请求console.log('发起请求:', data);});
}

以上就是几种常见的前端限流实现方法。根据具体的应用场景选择合适的策略,可以帮助你有效地管理请求频率,保护后端服务。

http://www.lqws.cn/news/93853.html

相关文章:

  • SpringCloud 分布式锁Redisson锁的重入性 高并发 获取锁
  • WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验
  • Day11
  • 【Spring AI】调用 DeepSeek 实现问答聊天
  • 使用Process Explorer、System Informer(Process Hacker)和Windbg工具排查软件高CPU占用问题
  • 4-C#的不同窗口传值
  • Linux下使用nmcli连接网络
  • 【Pytorch学习笔记】模型模块08——AlexNet模型详解
  • VR 虚拟仿真工器具:开启医学新视界的智慧钥匙​
  • LeetCode hot100-11
  • 1.6万字测评:deepseek-r1-0528横向对比 gemini-2.5-pro-0506和claude4
  • 3.1 HarmonyOS NEXT分布式数据管理实战:跨设备同步、端云协同与安全保护
  • MongoDB-6.0.24 主从复制搭建和扩容缩容详解
  • MongoDB账号密码笔记
  • 从0到1认识EFK
  • 【Linux】线程互斥
  • 手机邮箱APP操作
  • 深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理
  • Free2AI 实战指南:低成本、高扩展的企业级 AI 解决方案​
  • 【QT】在Qt6的`QTextEdit`中,同一行更新内容
  • WSL2 + RK3568 SDK 编译踩坑笔记
  • 【软件工程】可行性研究
  • Gradle依赖管理全面指南:从基础到高级实践
  • 对 `llamafactory-cli api -h` 输出的详细解读
  • YOLO学习笔记 | 一种用于海面目标检测的多尺度YOLO算法
  • 《数据挖掘》- 房价数据分析
  • Neo4j 备份与恢复:原理、技术与最佳实践
  • Neo4j 数据可视化与洞察获取:原理、技术与实践指南
  • LeetCode 300 最长递增子序列
  • MySQL关系型数据库学习