1

プロバイダーからページのリストからデータを取得する必要がある node.js アプリを作成しています。

var list = [
  { url: 'http://www.example.com/1' },
  { url: 'http://www.example.com/2' },
  ...
  { url: 'http://www.example.com/N' },
];

現在、うまく機能するasync.eachを使用しています。

async.each(
  list, // 1st param is the array of items
  function(elem, callback) { // 2nd param is the function that each item is passed to
    request(elem.url, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(body);
      }
    }),
  },
  function(err) { // 3rd param is the function to call when everything's done
    if (err) {
      console.error('Error in the final async callback:', err);
    }
  }
);

唯一の問題は、時間単位で同じ IP からのリクエストが過剰に発生したため、サイトのサーバーが (当然のことながら) 403 (禁止) ステータス コードで応答することがあることです...

メソッドもasync提供されているようです。その例は次のとおりです。whilst()

var count = 0;
async.whilst(
  function () { return count < 5; },
  function (callback) {
    count++;
    setTimeout(callback, 1000);
  },
  function (err) {
    // 5 seconds have passed
  }
);

しかし、それをリストで使用する方法、またはそれを組み合わせて使用​​する方法がわかりませんasync.each... :-(

答えは次のとおりです: node.js で非同期リクエストのリストを制限 (スロットル) するにはどうすればよいですか?

PS:より明確にするために、(可能であれば) リクエストをキューに入れたくありません。リクエストが完了するまでに長い時間がかかる可能性があるためです...:定義された時間間隔でリクエストを開始したいだけです(たとえば 5リクエストごとに ~ 10 秒...)。


アップデート:

alireza david のコメントの後、私は async.eachLimit を使用してみました。これは非常に有望に見えました...これは、モジュール githubサイトでの使用例です。

async.eachLimit(
    obj.files,
    limit
    function (file, complete) {
      complete();
    },
    function (err) {
    }
);

しかし、制限の使用法は文書化されておらず、私には明らかではありません...誰かが手掛かりを持っているなら...

4

1 に答える 1

1

ほとんどの場合、403 はリクエストを制限する必要があることを意味します。これは、Web サーバーが DDOS 攻撃を行っていると見なすためです。

この状況では、async.eachLimit()

async.eachLimit(obj.files, 1000,
    function (file, complete) {
      complete();
    },
    function (err) {

    });

更新 私はそれを得たと思います、limitオプションは同時リクエストの数です。この数を減らす必要があります (私の意見は、テストのためだけに 2 または 3 です)。

于 2015-09-25T16:34:12.033 に答える