2016-12-27 7 views
0

私は何千もの同時https呼び出しが行われているプロジェクトに取り組んでいます。 私の最初の質問は:同意限度はどこですか?同時にいくつの通話を行うことができますか?それはどういうもの? 第二に、私はubuntuシステムで作業します。ほとんどの場合、要求が多すぎるためシステムがハングします。何千もの同時リクエストを、一度に50または100リクエストなどのブロックに分割し、それらの完了時に次のリクエストのセットが呼び出されます。何千もの同時httpsリクエストをNodejsの小さなブロックに分割する

items.forEach(function(item) { 
     request().then(function() { 
      if(counter == items.length) { 
       deferred.resolve("Success"); 
       return deferred.promise; 
      } 
     }) 
     .catch(function(err) { 
      deferred.reject(err); 
     }); 
     counter++; 
    }); 

Items配列は、ほとんど以上10kです:よう

私のコードが見えます。

答えて

2

あなたは同意の制限があるブルーバード

var Promise = require("bluebird"); 
var join = Promise.join; 
var fs = Promise.promisifyAll(require("fs")); 
var concurrency = parseFloat(process.argv[2] || "Infinity"); 
console.time("reading files"); 
fs.readdirAsync(".").map(function(fileName) { 
    var stat = fs.statAsync(fileName); 
    var contents = fs.readFileAsync(fileName).catch(function ignore() {}); 
    return join(stat, contents, function(stat, contents) { 
     return { 
      stat: stat, 
      fileName: fileName, 
      contents: contents 
     } 
    }); 
// The return value of .map is a promise that is fulfilled with an array of the mapped values 
// That means we only get here after all the files have been statted and their contents read 
// into memory. If you need to do more operations per file, they should be chained in the map 
// callback for concurrency. 
}, {concurrency: concurrency}).call("sort", function(a, b) { 
    return a.fileName.localeCompare(b.fileName); 
}).then(function() { 
    console.timeEnd("reading files"); 
}); 
+0

これで、すべてのリクエストを一緒に送信し始めるでしょうか?私はこれが最初の50まで送信され、応答が返されるまで次の要求はトリガーされない。 –

+0

はい。彼らは前のバッチがすべて終わるまで待つでしょう。 –

+0

しかし、私のバッチは50のリクエストでなければならないと定義できますか? –

1

に​​同時実行オプションを使用できますか?

まず、あなたのすべての要求がevent loopに移動して、コールスタックに1つずつします。コールスタックがますます多くのアイテムを充填し始めると、実際の制限はないので、RAMを食べ始めるでしょう。

同時にいくつの呼び出しを行うことができますか?

することができます送信するために50ように一つのスロットで(任意の数)要求し、別のスロットと -

あなたは、直列および並列モデルを使用することができます。

シリーズリクエストとパラレルリクエストを行うには、それぞれasync seriesasync parallelを使用できます。

何が依存していますか?

最初の答えで述べたリンクを見てください。

関連する問題