2015-05-21 4 views
0

Это мое первое приложение nodejs. Я пытаюсь сделать cronjob с извлечением некоторого внешнего API и сделать некоторый расчет ответа.Ограничение цикла запросов Nodejs

Все работает нормально, пока curlList не станет большим. С 10 пунктами в curlList это okey, но у меня большой большой curlList более 90 предметов.

Каков наилучший способ выполнения этой реализации.

Спасибо за помощь.

С наилучшими пожеланиями, Джонни

var request = require('request'); 

var curlList = [{ 
    id: 1, 
    href: '/name1' 
}, { 
    id: 2, 
    href: '/name2' 
}, { 
    id: 3, 
    href: '/name3' 
}]; 

var curl = function(id, url) { 
    var payload = { 
     id: id 
    }; 

    var options = { 
     method: 'post', 
     body: payload, 
     json: true, 
     url: "" 
    } 

    request(options, function(err, res, body) { 
     if (err) { 
      console.log(err, 'error posting json') 
      return 
     } 
     //Calculate response data 

     //If match 
     if (match) { 
      console.log(url); 
     } 
    }); 
}; 

app.listen(3000, function() { 

    for (var i = 0; i < curlList.length; i++) { 
     var href = list[i].href; 
     var id = list[i].id; 
     curl(id, href); 
    } 

}); 

ответ

1

Вашего for цикл начинается все определенные запросы в считанных микросекундах - сайты, как правило, обнаружить такое навязчивое поведение как попытку перегрузить сервер (а DoS атаки). Также не рекомендуется делать это из-за ограничений вашего оборудования/сети - если вам нужно было выдать 1000 запросов, и каждый ответ будет иметь 1 МБ, вам вдруг потребуется загрузить 1 ГБ данных ответа. Что еще хуже, ваша сеть может настолько перегрузиться, что некоторые запросы будут просто отключены.

Вам нужно добавить какое-то дросселирование, чтобы ограничить количество запросов, сделанных в любой момент времени, до некоторой разумной суммы. Я лично рекомендую библиотеку async.js, в частности ее утилиту eachLimit().

1

Измените свой код, чтобы сделать что-то подобное;

var request = require('request'); 

var curlList = [{ 
    id: 1, 
    href: '/name1' 
}, { 
    id: 2, 
    href: '/name2' 
}, { 
    id: 3, 
    href: '/name3' 
}]; 

var curl = function(id, url, done) { 
    var payload = { 
     id: id 
    }; 

    var options = { 
     method: 'post', 
     body: payload, 
     json: true, 
     url: "" 
    } 

    request(options, function(err, res, body) { 
     done(err); 

     if (err) { 
      console.log(err, 'error posting json') 
      return 
     } 
     //Calculate response data 

     //If match 
     if (match) { 
      console.log(url); 
     } 
    }); 
}; 

app.listen(3000, function() { 
    int current = 1; 
    int max = 5; // max 5 parallel 
    var scheduleJobs = function() { 
     current--; 
     while(current < max) { 
      current++; 
      var job = curList.shift(); 
      curl(job.id, job.href, scheduleJobs); 
     } 
    } 
    scheduleJobs(); 
}); 

Это позволяет использовать 5 параллельных запросов.

+0

Спасибо, я обязательно попробую это, прежде чем вы ответите, я нашел другое решение. http://stackoverflow.com/questions/15682524/settimeout-in-nodejs-loop Но это кажется лучше. –

Смежные вопросы