0

我正在抓取一个 API。有很多很多的请求。如果我做了太多请求,API 一开始看起来很可疑,我得到一堆 503。没关系,当我得到 503 时,我在重新运行请求之前设置了一个计时器,这个计时器由两个用于同一请求的每个 503。

但它不起作用。因为我的计时器是异步的。当我得到 503 时,在启动此计时器后,Node 立即将套接字重用于挂起的请求。所以我的计时器基本上不会改变任何东西。

我怎样才能防止这种情况?

到目前为止我所尝试的:

  • settimeout在重新启动请求之前使用
  • 使用sync模块,它的pause(不起作用,因为光纤是异步的

任何的想法 ?:<

4

1 回答 1

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 );
于 2012-06-29T13:47:04.690 回答