如何设置一个非常快速的node.js UDP服务器

我对Node.js很陌生,我有一个应用程序的请求,会收到一个UDP数据包的负载和处理它。

我说的是每秒超过400条消息,达到200,000条消息/分钟。

我已经写了一个代码来build立一个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 

你缺less的概念,NodeJS并不意味着你的意思是multithreading,请求应该在一个循环中处理。 没有其他线程存在,所以没有发生上下文切换。 在多核环境中,您可以通过节点的集群模块创build一个集群,我在这里有一个关于这个的博客文章。

您将父进程设置为forksubprocess,并且只有subprocess应该绑定到一个端口。 你的父母程序将处理孩子之间的负载平衡。

注意 :在我的博客文章中,我使用了i < os.cpus().length / 2; 但它应该是i < os.cpus().length;

我写了一个类似结构的soap / xml转发服务,发现这个信息会包含2个数据包。 我需要更新我的代码来检测消息的两半,然后把它们放回去。 这个有效载荷大小的事情可能是一个HTTP问题比UDP的问题更多,但我的build议是,你添加日志logging,写出你收到的一切,然后用细牙梳理它。 看起来你会logging你现在正在得到的东西,但是你可能需要深入了解你正在失去的5%。

你怎么知道它的5%? 如果你再次发送stream量,它会一直是5%? 是相同的消息总是丢失。

我使用ruby和Event Machine构build了一个用于voip / sip调用数据的UDP服务器,到目前为止情况一直很好。 (虽然我对你的testing方法很好奇,但是我在做netcat的一切,或者一个小小的ruby客户端,我从来没有做过10k的消息)