2012-04-19 143 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的消息)