使用节点从速率受限的API获取数据

时间:2016-05-12 12:55:13

标签: node.js

我想使用node从速率受限的API中获取数据。 API具有每天和每月的限制。我无法找到一个算法,其中代码知道已经使用了该分钟/天允许的api调用的数量。

我希望我的逻辑:

帮助!

我的(伪)代码如下所示:

var unirest = require('unirest');
var csv = require('fast-csv');

keys = ['1a2a3a','2b1b2f']

function readData(a, b, key, cb) {

  var url = 'http://json.infoprovider.com/data.json?'
    + 'a=' + a
    + '&b=' + b
    + '&key=' + key

  unirest.get(url).end(function (response) {
    cb(response.body);
  })   
}

csv
.fromPath("data.csv", { headers: true })
.on("data", function (data) {

    readData(data.a, data.b, key[0], function (r) {
        console.log("a: " + data.a + ", lng: " + data.b + ", result: " + (JSON.stringify(r)));
        console.log("API consumed: " & r.UsedThisDay)
    })
})

1 个答案:

答案 0 :(得分:1)

您可以使用node-rate-limiter

从他们的例子中可以看出:

var RateLimiter = require('limiter').RateLimiter;
var limiter = new RateLimiter(1, 250);


limiter.removeTokens(1, function() {
  callMyMessageSendingFunction(...);
});

只需在其中添加一个计数器,将其与当天相关联,如果您这样做,您可以自行评估限制以及限制每天的请求。

var RateLimiter = require('limiter').RateLimiter;
var limiter = new RateLimiter(1, 250);
var requestsToday = 0; // Gets reset on each "new" day
var requestsLimitPerDay = 200;

limiter.removeTokens(1, function() {
  callMyMessageSendingFunction(...);
});

function callMyMessageSendingFunction() {
    requestsToday++;
    if (requestsToday < requestsLimitPerDay) {
        makeAPICall();
    }
}

我只建议两者,因为如果它每天有一个限制,它可能也有每秒/分钟的限制;根据我的经验。最好全面控制你的请求。在一些大型服务器上运行的多核Nodejs应用程序是一种可靠的方式来激怒Web服务,因为它会在Web请求之后不加考虑地触发并发Web请求。

您还可以选择计算每天的请求限制,并在24小时内将其用作RateLimiter(1, x)参数,尽管您不会快速恢复API调用。