2012-06-27 3 views
0

Я сканирую API. Существует много многих запросов. И если я делаю слишком много запросов, API начинает с подозрения, и я получаю кучу 503. Это нормально, когда я получаю 503, я установил таймер перед повторным запуском запроса, и этот таймер работает от два для каждого 503 одного запроса.Заблокировать сокет, используемый агентом

НО это не работает. Потому что мой таймер является асинхронным. Когда я получу 503, после запуска этого таймера узел немедленно повторно использует сокет для ожидающего запроса. Поэтому мой таймер в принципе ничего не меняет.

Как я могу предотвратить это?

То, что я пытался до сих пор:

  • использованием settimeout перед повторным запуском запроса
  • с помощью sync модуля и его pause (не работает, потому что волокно asynchroneous

Есть идеи? <

ответ

0

Я, наконец, пришел к выводу, что это не возможно в это время.

Для предотвращения массивного затопления я использую объект queue модуля async. Код выглядит примерно так:

var queue = new Sync.Queue(function (task, markAsComplete) { 
    Http.request({ 
    agent : false, // we will use our own rate limiter, so we don't need agents 
    ... 
    }, function (err, res) { 
    res.on('end', function () { 
     if (IS_503) { 
     var originalConcurrency = queue.concurrency; // saving the original concurrency 
     queue.concurrency = 1;      // our timeout will now stop every request 
     setTimeout(function () { 
      queue.concurrency = originalConcurrency; // restoring the concurrency 
      queue.push(task); 
      markAsComplete(); 
     }, 1000); 
     } 
    }); 
    }); 
}, numberOfParallelRequests); 
Смежные вопросы