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

问题描述 投票:11回答:3

我对Node.js相当陌生,我有一个请求,该应用程序将接收UDP数据包的有效负载并对其进行处理。

我说的是每秒超过400条消息,这将达到每分钟200.000条消息。

[我已经写了代码来设置UDP服务器(实际上是从文档http://nodejs.org/api/all.html#all_udp_datagram_sockets中获得的,但是它丢失了大约5%的数据包。

我真正需要开发的是一台服务器,它将获取数据包并将其发送给另一个worker来处理消息。但是看起来在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
javascript node.js udp
3个回答
2
投票

[您缺少概念,就您的意思而言,NodeJS并不意味着是多线程的,请求应该以循环的方式处理。不存在其他线程,因此不会发生上下文切换。在多核环境中,您可以通过节点的集群模块创建集群,我有一篇有关此here的博客文章。

您将父进程设置为派生子进程,并且只有子进程应绑定到端口。您的父进程将处理子进程之间的负载平衡。

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


0
投票

我编写了一个具有类似结构的soap / xml转发服务,发现该信息以2个数据包的形式出现。我需要更新代码以检测消息的两半并将它们放回原处。有效负载大小的问题可能更多是HTTP问题,而不是udp问题,但我的建议是添加日志记录以写出接收到的所有内容,然后用细齿梳将其遍历。看起来您正在记录现在所获得的收益,但是您可能必须挖掘损失的5%。

您怎么知道它的5%?如果您再次发送该流量,是否总是5%?总是丢失相同的消息。

我使用ruby和Event Machine构建了一个用于voip / sip呼叫数据的UDP服务器,到目前为止一切正常。 (不过,我对您的测试方法感到好奇,我正在通过netcat或小型ruby客户端进行所有操作,但从未发送过1万条消息)


0
投票

这里有个微妙的提示。为什么将UDP用于流?您需要对流使用TCP。 UDP协议发送数据报,离散消息。它不会在后台将它们分开。 您发送的是通过UDP接收到的。 (IP碎片是另一个问题,我在这里不讨论)。您不必担心在另一侧重新组装流。这是使用UDP而不是TCP的主要优点之一。另外,如果您将localhost转换为localhost,则不必担心由于网络故障而丢失数据包。如果溢出网络堆栈缓冲区,则可能会丢失数据包,因此,如果要进行高速数据传输,请给自己一个较大的数据包。因此,无需考虑流,只需使用UDP send:

var udp_server = dgram.createSocket({类型:“ udp4”,repeatAddr:是的,recvBufferSize:20000000 // << ==强大的大缓冲区});

udp_server.send(“ Badabing,badaboom”,remote_port,remote_address);

Go是Google开发的,用于应对现代科技商店中语言的泛滥。 (我同意,这太疯狂了)。我不能使用它,因为它的文化和设计禁止使用异常,这是现代语言所具有的最重要的功能,可以消除旧式错误处理所带来的大量混乱。除此之外,还可以,但是对我来说,这是个表演的障碍。

© www.soinside.com 2019 - 2024. All rights reserved.