12

我对 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
4

3 回答 3

3

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

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

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

于 2012-04-19T20:44:23.237 回答
0

我写了一个类似结构的soap/xml转发服务,发现信息会分2个包来。我需要更新我的代码以检测消息的两半并将它们重新组合在一起。这个有效负载大小的问题可能更像是一个 HTTP 问题而不是 udp 问题,但我的建议是添加日志记录以写出您收到的所有内容,然后用细齿梳理一下。看起来你会记录你现在得到的东西,但你可能不得不挖掘你正在失去的 5%。

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

我使用 ruby​​ 和 Event Machine 为 voip/sip 呼叫数据构建了一个 UDP 服务器,到目前为止一切运行良好。(不过我对你的测试方法很好奇,我在 netcat 或一个小型 ruby​​ 客户端上做所有事情,我从来没有做过 10k 条消息)

于 2012-06-13T19:34:02.767 回答
0

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

var udp_server = dgram.createSocket({ type: 'udp4', reuseAddr: true, recvBufferSize: 20000000 // <<== 强大的大缓冲区 });

udp_server.send("Badabing, badaboom", remote_port, remote_address);

Go 是由谷歌开发的,用于处理现代科技商店中出现的语言激增。(这很疯狂,我同意)。我不能使用它,因为它的文化和设计禁止使用异常,这是现代语言消除旧式错误处理所增加的大量混乱的最重要功能。除此之外,这很好,但这对我来说是一个表演障碍。

于 2020-04-26T18:57:48.393 回答