前端防止服務(wù)器過(guò)載實(shí)現(xiàn)限流的常見策略和技術(shù)指南
前端限流是一種控制請(qǐng)求頻率的技術(shù),旨在防止過(guò)多的請(qǐng)求在同一時(shí)間段內(nèi)發(fā)送到服務(wù)器,避免造成服務(wù)器過(guò)載或觸發(fā)反爬蟲機(jī)制。實(shí)現(xiàn)前端限流的方法有很多,下面介紹幾種常見的策略和技術(shù):
1. 時(shí)間窗口算法
時(shí)間窗口算法是最簡(jiǎn)單的限流方式之一,它基于固定的時(shí)間間隔來(lái)限制請(qǐng)求數(shù)量。
let lastRequestTime = 0;
const REQUEST_INTERVAL = 500; // 請(qǐng)求間隔為500毫秒
function makeRequest(data) {
const now = new Date().getTime();
if (now - lastRequestTime > REQUEST_INTERVAL) {
lastRequestTime = now;
// 發(fā)起實(shí)際的網(wǎng)絡(luò)請(qǐng)求
console.log('發(fā)起請(qǐng)求:', data);
} else {
console.log('請(qǐng)求過(guò)于頻繁,請(qǐng)稍后再試');
}
}2. 漏桶算法
漏桶算法將所有請(qǐng)求放入一個(gè)“桶”中,并以固定的速率處理這些請(qǐng)求。如果桶滿了,新的請(qǐng)求就會(huì)被拒絕或者排隊(duì)等待。
class LeakyBucket {
constructor(rate, capacity) {
this.rate = rate; // 處理速度(每毫秒處理多少個(gè)請(qǐng)求)
this.capacity = capacity; // 桶的最大容量
this.waterAmount = 0; // 當(dāng)前水量
this.lastLeakTimestamp = Date.now(); // 上次漏水的時(shí)間戳
}
canMakeRequest() {
const now = Date.now();
const elapsedTime = now - this.lastLeakTimestamp;
const leakedAmount = elapsedTime * this.rate;
// 更新當(dāng)前水量
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); // 設(shè)置每毫秒處理0.1個(gè)請(qǐng)求,最大容量為10
function makeRequest(data) {
if (bucket.canMakeRequest()) {
// 發(fā)起實(shí)際的網(wǎng)絡(luò)請(qǐng)求
console.log('發(fā)起請(qǐng)求:', data);
} else {
console.log('請(qǐng)求過(guò)于頻繁,請(qǐng)稍后再試');
}
}3. 計(jì)數(shù)器算法
計(jì)數(shù)器算法通過(guò)記錄一段時(shí)間內(nèi)的請(qǐng)求數(shù)量來(lái)進(jìn)行限流。當(dāng)達(dá)到設(shè)定的最大請(qǐng)求數(shù)時(shí),在剩余時(shí)間內(nèi)不再接受新的請(qǐng)求。
let requestCount = 0;
const MAX_REQUESTS = 5; // 最大請(qǐng)求數(shù)
const TIME_WINDOW = 1000; // 時(shí)間窗口大小為1秒
function resetCounter() {
setTimeout(() => {
requestCount = 0;
}, TIME_WINDOW);
}
function makeRequest(data) {
if (requestCount < MAX_REQUESTS) {
requestCount++;
// 發(fā)起實(shí)際的網(wǎng)絡(luò)請(qǐng)求
console.log('發(fā)起請(qǐng)求:', data);
if (requestCount === 1) { // 第一次請(qǐng)求時(shí)重置計(jì)數(shù)器
resetCounter();
}
} else {
console.log('請(qǐng)求過(guò)于頻繁,請(qǐng)稍后再試');
}
}4. 使用第三方庫(kù)
對(duì)于更復(fù)雜的場(chǎng)景,可以考慮使用現(xiàn)成的限流庫(kù),如 bottleneck 或 limiter,它們提供了更多高級(jí)功能和配置選項(xiàng)。
例如,使用 bottleneck:
首先安裝依賴:
npm install bottleneck
然后在代碼中使用:
const Bottleneck = require("bottleneck");
// 創(chuàng)建一個(gè)限流器,每秒最多允許5個(gè)請(qǐng)求
const limiter = new Bottleneck({
maxConcurrent: 1,
minTime: 200 // 每200ms允許一個(gè)新的請(qǐng)求
});
async function makeRequest(data) {
await limiter.schedule(() => {
// 發(fā)起實(shí)際的網(wǎng)絡(luò)請(qǐng)求
console.log('發(fā)起請(qǐng)求:', data);
});
}以上就是幾種常見的前端限流實(shí)現(xiàn)方法。根據(jù)具體的應(yīng)用場(chǎng)景選擇合適的策略,可以幫助你有效地管理請(qǐng)求頻率,保護(hù)后端服務(wù)。
到此這篇關(guān)于前端防止服務(wù)器過(guò)載實(shí)現(xiàn)限流的常見策略和技術(shù)指南的文章就介紹到這了,更多相關(guān)前端限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
layui在表格中嵌入上傳按鈕并修改上傳進(jìn)度條的實(shí)例
這篇文章主要介紹了layui在表格中嵌入上傳按鈕并修改上傳進(jìn)度條的實(shí)例,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07
JavaScript前端實(shí)現(xiàn)PDF加解密
Dynamsoft?Document?Viewer是一個(gè)用于文檔掃描和查看的JavaScript?SDK,可以在前端對(duì)PDF文件進(jìn)行加密和解密,下面我們就來(lái)看看它的具體使用吧2024-12-12
JavaScript實(shí)現(xiàn)滑塊驗(yàn)證解鎖
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)滑塊驗(yàn)證解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
你不知道的5個(gè)JavaScript中JSON的秘密功能分享
在開發(fā)中,我們會(huì)經(jīng)常使用?JSON.stringify(object)?來(lái)序列化對(duì)象,但JSON.stringify方法除了了第一個(gè)參數(shù)外,還有其它參數(shù)可用,今天我們一起來(lái)看看這些參數(shù)是做啥的2023-05-05
優(yōu)化innerHTML操作(提高代碼執(zhí)行效率)
多數(shù)現(xiàn)代瀏覽器都實(shí)現(xiàn)了innerHTML操作,它的方便性讓我們愛(ài)不釋手,但如果使用不當(dāng),很容易出現(xiàn)效率問(wèn)題,本文通過(guò)一個(gè)例子來(lái)說(shuō)明如何優(yōu)化innerHTML操作。2011-08-08
原生js實(shí)現(xiàn)shift/ctrl/alt按鍵的獲取
小測(cè)試shift、ctrl、alt按鍵的獲取,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04
Cropper.js 實(shí)現(xiàn)裁剪圖片并上傳(PC端)
本案例是參考cropper站點(diǎn)實(shí)例,進(jìn)行修改簡(jiǎn)化。接下來(lái)通過(guò)本文給大家分享Cropper.js 實(shí)現(xiàn)裁剪圖片并上傳(PC端) 功能,需要的朋友參考下吧2017-08-08
JavaScript?CSS解析B站的彈幕可以不擋人物原理及技巧
這篇文章主要為大家介紹了JavaScript?CSS解析B站的彈幕可以不擋人物原理及技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

