2016-07-15 13 views
0

Node.jsにいくつかのテストコードを書いていますが、HTTPリクエストをWebサーバーに繰り返しPOSTします。同じサーバーへ2つの同時node.js POST要求を送信することは可能ですか?

function doPost(opts, data) { 
    var post_req = http.request(opts, function(res) { 
     res.setEncoding('utf8') 
     res.on('data', function (chunk) { }) 
    }) 
    post_req.write(JSON.stringify(data)) 
    post_req.end() 
} 
setInterval(doPost, interval, opts, msg) 

これらの要求が順次発行されること、つまり、最初のPOSTが応答を受信するまで、後続のPOSTが送信されないようにすることをお勧めします。

私の質問は:実行時に使用されたnon-blocking architecture of the underlying libuv libraryのため、このコードはWebサーバーへの接続で1つのPOSTを送信する可能性がありますが、サーバーはまだ到着していませんか?

これはselect()ループで想像すれば、私は2番目のPOSTのwrite()を呼び出すだけで、EWOULDBLOCKを得ることができます。または、ネットワークが落ちたら、IOスレッドプールまでキューに入れられたPOST要求のバックログを構築するだけでしょうか?この場合、どのような行動が予想されるのかは不明です。次のPOSTが始まる前にPOSTの完了を強制するために何かをする必要がありますか?

+0

あなたは非同期ライブラリを調べましたか? https://www.npmjs.com/package/async 'eachSeries'はあなたが見たい機能です。 – aschmid00

答えて

0

Inherintly Node.jsは、複数のプロセスを実行するために単一のスレッド上で実行されるため、クラスタを実行する必要があります。Javaではマルチスレッドに似ています。 (Node.js documentation on clusters参照)。たとえば、コードは次のようになります。

var cluster = require('cluster'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 
    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    }); 
} 
else { 

    //call the code in doPost 
    doPost(opts, data); 
} 
+0

申し訳ありませんが、私の質問は間違った印象を与えたと思います。私は並行投稿をしようとしていない、私は前の投稿の200 OK応答を受け取るまで、後のPOST送信をブロックすることを好むだろうと思う。ノンブロッキングIOについて知っていることに基づいて、それを保証するものは何もないので、Node.jsとどのように動作するかを明確にしたいだけです。 – zcombinator

+0

@zcombinator、非同期コントロールが必要な場合は、外部ライブラリを使用する必要があります。 [Async](https://github.com/caolan/async)は、非同期制御フローのツールに最適です。 – criticalJ

0

私は自分の答えを見つけたと思います。私はパケットキャプチャの下でいくつかのテストを実行し、ネットワークが落ちるとPOSTリクエストを抑制することが重要であることを発見しました。そうでなければIOプールにenqueue'dを取得し、接続状態に応じていくつか送信したり、マングローブです

関連する問題