Что является причиной превышения ограничения скорости в моей программе?
Я использую API Stackru для сбора тегов в Stackru. Я использую NodeJS и сталкиваюсь с типичной проблемой. Мой предел скорости превышен после 230-250 запросов. Насколько я понял, он позволяет <30req/sec . Так что он должен нормально работать в соответствии с моей программой, но вместо этого я получаю исключение после 200+ циклов. Мой код nodejs выглядит следующим образом:
var request=require('superagent');
var request=require('mongoose');
mongoose.connect('mongodb://shivkumarganesh:11111@paulo.mongohq.com:10090/lklklklkkkkl_gshiv_sk');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
console.log('Connected');
});
//Schema for Tags
var tagSchema = mongoose.Schema({
name:String,
count:Number,
is_required:Boolean
, is_moderator_only:Boolean,
has_synonyms:Boolean});
var Tags = mongoose.model('Tags', tagSchema);
var saveSchema = function(Model){
Model.save();
}
///usr/local/lib/node_modules/superagent
var i=1;
var req=function(){
request.get('http://api.stackexchange.com/2.1/tags?page='+i+'&pagesize=100&fromdate=1199145600&todate=1377648000&order=asc&sort=popular&site=stackru')
.set('X-API-Key', 'foobar')
.set('Accept', 'application/json')
.end(function(res){
if (res.ok && i<346) {
console.log('yay got ' + res.body);
var jsonResponse = res.body;
console.log(jsonResponse.items.length);
for(var j=0;j<jsonResponse.items.length;j++)
{
var model = new Tags(jsonResponse.items[j]);
saveSchema(model);
}
i++;
console.log("Number of Iteration ---- > "+i);
setTimeout(function() {
req();
}, 3000);
} else {
console.log('Oh no! error ' + res.text);
console.log('Processing Over'+i)
}
});
}
req();
Пожалуйста, помогите мне разобраться в этом. Если возможно, пожалуйста, исправьте программу. Примечание: я забавляю MongoHQ для хранения данных.
1 ответ
Вы должны прочитать эту информативную ссылку: https://api.stackexchange.com/docs/throttle
В частности:
Динамический дроссель также установлен на уровне каждого метода. Если приложение получает ответ с установленным полем отката, оно должно подождать столько секунд, прежде чем снова выполнить тот же метод.
Так что проверьте backoff
поле возвращено, и подождите столько, прежде чем делать еще один запрос.