2012-04-19 100 views
9

我對Node.js很陌生,我有一個應用程序的請求會接收UDP數據包的有效載荷並處理它。如何設置一個非常快的node.js UDP服務器

我正在談論每秒超過400條消息,這將達到像200.000條消息/分鐘。

我已經編寫了一個代碼來設置一個UDP服務器(實際上從文檔http://nodejs.org/api/all.html#all_udp_datagram_sockets中獲取),但它丟失了大約5%的數據包。

我真正需要開發的是一個服務器,它將獲得該數據包並將其發送給另一個工作人員完成與該消息的工作。但看起來像node.js中的線程是一場噩夢。

這是我的核心爲是:

var dgram = require("dgram"); 
var fs = require("fs"); 
var stream = fs.createWriteStream("received.json",{ flags: 'w', 
    encoding: "utf8", 
    mode: 0666 }); 

var server = dgram.createSocket("udp4"); 
server.on("message", function (msg, rinfo) { 
    console.log("server got: " + msg + " from " + 
    rinfo.address + ":" + rinfo.port); 
    stream.write(msg); 
}); 

server.on("listening", function() { 
    var address = server.address(); 
    console.log("server listening " + 
     address.address + ":" + address.port); 
}); 

server.bind(41234); 
// server listening 0.0.0.0:41234 
+2

請記住,數據報,不像TCP套接字,沒有保證的廣告收據。相反,數據報關注速度,而不需要確認單個消息。 – skeggse 2013-01-09 08:10:05

+0

這就是這樣的事情,讓我切換到Go,永不回頭。 – 2017-02-28 17:57:37

+0

@AParacha請詳細說明,我在聽:D – 2017-07-29 13:06:59

回答

2

你缺少概念,是的NodeJS並不意味着是多線程的條款你的意思,請求應在一個週期內進行處理。沒有其他線程存在,所以沒有發生上下文切換。在多核環境中,您可以通過節點的集羣模塊創建集羣,我有一個關於此here的博客文章。

您將父進程設置爲fork子進程,並且只有子進程應綁定到端口。您的父母程序將處理孩子之間的負載平衡。

注意:在我的博客文章,我做了i < os.cpus().length/2;但它應該是i < os.cpus().length;

+0

對不起,我想我沒有很好地解釋我,但事實是:作爲一個UDP客戶端,我可以在一秒鐘內發送超過10k個UDP數據包,但是在本地主機到本地主機環境中,UDP服務器缺少5%左右。無論如何,我的服務器已經很響應,它響應超過1000(1kb)消息/秒這對我來說已經足夠了。 – Panthro 2012-04-20 00:14:41

+0

你寫過:「我真正需要開發的是一個服務器,它可以獲取數據包並將其發送給另一個工作人員執行該消息。」但是,我認爲你想減少5%的錯誤率?你可以重新寫你的問題嗎? – Mustafa 2012-04-20 09:31:37

0

我寫了一個SOAP/XML轉發服務具有相似的結構,並發現該信息會進來2包。我需要更新我的代碼來檢測消息的兩半並將它們放回到一起。這個有效載荷大小的事情可能更多的是一個HTTP問題,而不是一個UDP問題,但我的建議是,你添加日誌記錄來寫出你正在接收的一切,然後用細齒梳理它。看起來你會記錄你現在得到的東西,但是你可能需要深入瞭解你失去的5%。

你怎麼知道它的5%? 如果您再次發送該流量,它會一直是5%嗎? 是相同的消息總是丟失。

我使用ruby和Event Machine構建了一個用於voip/sip調用數據的UDP服務器,到目前爲止事情一直很好。 (我很好奇你的測試方法,雖然,我用netcat的做的一切,或紅寶石小客戶端,我從來沒有10K的消息)