限制对第三方API的请求

时间:2016-07-20 12:52:49

标签: javascript node.js api request rate-limiting

我的代码:

const limit = require('simple-rate-limiter')
const request = limit(require('request').defaults({
    gzip: true
})).to(15).per(10 * 1000) // 15 requests per 10 seconds

request(API_ENDPOINT, callback) // call API thousands of times

图书馆:simple-rate-limiter和众所周知的request图书馆。

我需要数千次调用第三方API,每10秒只允许15次请求。上述代码不会正确限制我的请求,因此服务器会发送429 Too Many Requests HTTP状态代码。

我可以一次发送15个请求但是程序必须等待10秒才能发送更多请求,否则它将再次获得429响应。

我认为这是因为与服务器的连接需要几百毫秒到几秒(300ms-2s)。所以我的请求时间与服务器收到请求的时间不同。

来自服务器的响应包含Date标头。可以用某种方式来正确限制请求吗?有没有一个图书馆让这很容易?即使在实施正确的速率限制后,如果您收到429响应,是否有一种简单的方法可以重试?

1 个答案:

答案 0 :(得分:0)

好的,所以方法是检查从开始到结束通过的时间。我将假设每隔667毫秒调用API是安全的。

var startTime,
    endTime;

function timeDiff() {
    return (endTime.getTime() - startTime.getTime());
}
function startRequest() {
    startTime = new Date();
    request(API_ENDPOINT, requestCallback)
}
function requestCallback(data) {
   //do what you please with data
   endTime = new Date();  
   var diff = timeDiff(); 
   if(diff < 667) {
        //To early to start API, need to wait.
        setTimeout(startRequest, 667 - diff);
   } else {
        //It is fine to start request now.
        setTimeout(startRequest);
   }
}

startRequest();

此代码将在调用完成后立即调用API,除非它的完成时间超过667毫秒。