2012-06-27 43 views
0

我正在爬取API。有许多许多要求。如果我做了太多的请求,API开始看起来很可疑,并且我得到了一堆503.没关系,当我得到503时,我已经在重新运行请求之前设置了一个计时器,并且此计时器由每503个相同的请求两个。阻止代理使用的套接字

但它不工作。因为我的计时器是异步的。当我得到503时,在启动这个定时器之后,Node立即重新使用套接字来处理未决请求。所以我的计时器基本上不会改变什么。

我该如何预防?

我迄今为止尝试:用settimeout重新使用sync模块请求

    • ,其pause(是不行的,因为光纤是asynchroneous

    任何想法?:<

  • 回答

    0

    我终于得出结论,它不是可能在这个时候。

    为了防止大面积泛滥,我使用async模块的queue对象。代码是这样的:

    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);