2016-07-15 52 views
0

我在Node.js中寫了一些測試代碼,它們只是多次將HTTP請求發佈到Web服務器。以簡化形式:是否有可能在同一個服務器上有兩個併發的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接收的響應隨後的後未發送發出。

我的問題是:由於運行時使用的non-blocking architecture of the underlying libuv library,是否有可能此代碼通過連接發送一個POST到Web服務器,但是然後能夠執行另一個帖子,即使來自服務器尚未到達?

如果我想象一下select()循環,我可以自由地爲第二個POST調用write()並獲取EWOULDBLOCK。或者如果網絡丟失,它是否會建立排隊等待IO線程池的POST請求的積壓?我不清楚在這種情況下我應該期待什麼樣的行爲。在下一次POST開始之前,我需要做些什麼來強制完成POST?

+0

你看過異步庫嗎? https://www.npmjs.com/package/async'eachSeries'是您想要查看的功能。 – aschmid00

回答

0

繼承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

對不起,我想我的問題給人的印象是錯誤的。我不是想要實現平行帖子,我想我希望後續POST發送阻止,直到我收到前一篇文章的200 OK響應。我只是想澄清一下,它是如何與Node.js一起工作的,因爲基於我所知道的非阻塞IO,沒有任何保證。 – zcombinator

+0

@zcombinator,如果你想異步控制,你將不得不使用外部庫。 [異步](https://github.com/caolan/async)非常適合異步控制流的工具。 – criticalJ

0

我想我找到了我的答案。我在數據包捕獲下運行了一些測試,發現當網絡丟失時,重要的是要限制你的POST請求,否則請求會被排入IO池,並且取決於連接狀態,有些可能發送,其他請求可能不會發送,而消息順序被打破了。

相關問題