我想使用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)
})
})
答案 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调用。