0

API をクロールしています。多くの多くの多くの要求があります。そして、あまりにも多くのリクエストを行うと、API が怪しいと思われることから始まり、大量の 503 が返されます。問題ありません。503 が返されたら、リクエストを再実行する前にタイマーを設定しました。このタイマーは、同じリクエストの 503 ごとに 2 つ。

しかし、うまくいきません。私のタイマーは非同期だからです。503 を取得すると、このタイマーを開始した後、Node は保留中の要求のためにソケットをすぐに再利用します。したがって、私のタイマーは基本的に何も変更しません。

どうすればこれを防ぐことができますか?

私がこれまでに試したこと:

  • settimeoutリクエストを再開する前に a を使用する
  • 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 に答える