接口调用频率太高,如何做好接口的限制呢?

471 阅读2分钟

"接口调用频率太高,如何做好接口的限制呢?

  1. 首先,设置请求频率限制。可以通过在服务器端设置请求频率限制来控制接口的调用频率。一种常用的方法是使用令牌桶算法,即为每个用户分配一个令牌桶,每次请求需要消耗一个令牌,当令牌桶为空时,请求被拒绝。下面是一个简单实现的示例代码:
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 表示可以继续请求,否则则需要等待一段时间再重试。
  1. 其次,设置并发限制。除了请求频率限制外,还可以设置并发限制来控制同时进行的请求数量。可以通过使用信号量或者队列来实现并发限制。下面是一个使用队列实现并发限制的示例代码:
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 方法,它会将请求加入请求队列中,如果当前并发数量不超过最大并发数量,则发送请求,否则等待其他请求完成后再处理。

通过设置请求频率限制和并发限制,可以有效地控制接口的调用频率,防止接口被过度请求。这样可以保护服务器的稳定性和性能,并提供更好的用户体验。"