"接口调用频率太高,如何做好接口的限制呢?
- 首先,设置请求频率限制。可以通过在服务器端设置请求频率限制来控制接口的调用频率。一种常用的方法是使用令牌桶算法,即为每个用户分配一个令牌桶,每次请求需要消耗一个令牌,当令牌桶为空时,请求被拒绝。下面是一个简单实现的示例代码:
const tokens = {}; // 令牌桶
function getToken(userId) {
const now = Date.now();
const interval = 1000; // 每秒产生一个令牌
const maxTokens = 10; // 令牌桶的最大容量
if (!tokens[userId]) {
tokens[userId] = {
count: 1,
lastUpdated: now
};
return true;
}
const userTokens = tokens[userId];
const elapsedTime = now - userTokens.lastUpdated;
const newTokens = Math.floor(elapsedTime / interval); // 计算间隔时间内产生的新令牌
userTokens.count = Math.min(userTokens.count + newTokens, maxTokens);
userTokens.lastUpdated = now;
if (userTokens.count > 0) {
userTokens.count--;
return true;
} else {
return false;
}
}
// 在接口请求时调用 getToken 方法,如果返回 true 表示可以继续请求,否则则需要等待一段时间再重试。
- 其次,设置并发限制。除了请求频率限制外,还可以设置并发限制来控制同时进行的请求数量。可以通过使用信号量或者队列来实现并发限制。下面是一个使用队列实现并发限制的示例代码:
const requestQueue = []; // 请求队列
let concurrentCount = 0; // 当前并发数量
const maxConcurrentCount = 10; // 最大并发数量
function makeRequest(url, data) {
return new Promise((resolve, reject) => {
requestQueue.push({ url, data, resolve, reject });
processQueue();
});
}
function processQueue() {
if (concurrentCount >= maxConcurrentCount) {
return;
}
const request = requestQueue.shift(); // 取出队列中的请求
if (request) {
concurrentCount++;
// 发送请求
sendRequest(request.url, request.data)
.then(response => {
concurrentCount--;
request.resolve(response);
processQueue();
})
.catch(error => {
concurrentCount--;
request.reject(error);
processQueue();
});
}
}
// 在接口请求时调用 makeRequest 方法,它会将请求加入请求队列中,如果当前并发数量不超过最大并发数量,则发送请求,否则等待其他请求完成后再处理。
通过设置请求频率限制和并发限制,可以有效地控制接口的调用频率,防止接口被过度请求。这样可以保护服务器的稳定性和性能,并提供更好的用户体验。"