2013-10-27 48 views
0

下面是一個簡單的TCP-Server壓力測試。只要我們每個客戶端只發送一條消息,一切都按預期工作。但是,當每個客戶端發送兩條消息時,服務器突然停止,沒有異常或錯誤。 那麼這是一個錯誤還是一個特性?Node.js無法處理多個tcp郵件

var net = require("net"); 
var async = require("async"); 
var cluster = require("cluster"); 

// `ulimit -n` tells us that we can open max. 1024 files per process. 
// Creating a socket means opening a file so we are limited. 
var CLIENTS = 1000; 

// Here is the weird part: 
// - sending one message per client works fine 
// - sending multiple message per client sucks 
var MESSAGES = 2; 

var TOTAL = CLIENTS * MESSAGES; 
var PORT = 1234; 
var HOST = "127.0.0.1"; 

if (cluster.isMaster) { 
    var count = 0; 
    var start = new Date; 

    var server = net.createServer(function(socket) { 
    socket.on("data", function(data) { 
     var t; 
     count++; 
     console.log("server received " + count + " messages"); 
     socket.write(data, function(err) { if (err) console.error(err); }); 
     if (count === TOTAL) { 
     t = (new Date) - start; 
     console.log("server received and sent " + count + " messages within " + t + "ms"); 
     } 
    }); 
    }); 

    server.listen(PORT, HOST, function() { cluster.fork(); }); 

} else { 

    var run = function(i) { 
    var c = net.connect({ port: PORT, host: HOST }, function() { 
     var tasks = (function() { 
     var results = []; 
     for (var x = 1; x <= MESSAGES; ++x) { 
      results.push((function(x) { 
      return function(next) { c.write("Hello server!", next); }; 
      })(x)); 
     } 
     return results; 
     })(); 

     async.series(tasks, function(err) { 
     if (err) { console.error(err); } 
     }); 

    }); 
    }; 
    for (var i = 1; i <= CLIENTS; ++i) { run(i); } 
} 

測試在Linux 3.11,Node.js的0.10.21

回答

2

你假設從客戶端調用.write兩次觸發data事件兩次在服務器上,不考慮任何緩衝可能將繼續其中將coalecse多個寫道。

當調用回調到.write時,並不意味着它實際發送的消息,這意味着消息被放入某個內核緩衝區(當它發送到服務器時可能包含多條消息)。

+0

我該如何確保郵件已發送? – flosse

+0

好吧,我的錯:一切正常,我只是忘了定義分隔符來識別消息結束/開始。 – flosse