如何设置一个非常快速的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的消息)
- 如何更新sail.js中主行内的一个子行
- Angular2应用程序不从没有节点服务器的index.html开始
- 通过fn.apply或fn.bind将函数传递给setTimeout
- Laravel 5扩展Elixir以包括browserify
- 在q-io / http.request上进行ETIMEDOUT
- 我怎样才能解决learnyounode HTTP收集没有第三方库
- TypeError:undefined不是node.js / express.js中的函数
- HTML 5video播放器使用emulater而不是实际的设备
- 如何将图像转换为sails.js中的base64编码的数据URL,或者通常在服务器端JavaScript?