12

私は Node.js を初めて使用し、UDP パケットのペイロードを受信して​​処理するアプリケーションを要求しています。

1 秒あたり 400 件を超えるメッセージについて話しているので、1 分あたり 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

ここで微妙なヒント。ストリームに UDP を使用したのはなぜですか? ストリームには TCP を使用する必要があります。UDP プロトコルは、データグラム、個別のメッセージを送信します。舞台裏でそれらをバラバラにすることはありません。送信するものは、UDP で受信するものです。 (IP フラグメンテーションは別の問題なので、ここでは説明しません) . 反対側でストリームを再構築することを気にする必要はありません。これは、TCP の代わりに UDP を使用する主な利点の 1 つです。また、localhost から localhost への接続を行っている場合、ネットワークの問題によるパケットの損失を心配する必要はありません。ただし、ネットワーク スタック バッファがオーバーフローするとパケットが失われる可能性があるため、高速データ転送を行っている場合は大きなパケットを用意してください。したがって、ストリームのことは忘れて、UDP 送信を使用してください。

var udp_server = dgram.createSocket({ type: 'udp4', reuseAddr: true, recvBufferSize: 20000000 // <<== 非常に大きなバッファ });

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

Go は、現代の技術ショップで発生する言語の急増に対処するために Google によって開発されました。(それはクレイジーです、私は同意します)。古いファッションのエラー処理によって追加された膨大な量の混乱を取り除くために、現代の言語が持つ最も重要な機能である例外の使用がその文化と設計によって禁止されているため、私はそれを使用できません。それ以外は問題ありませんが、それは私にとってショーストッパーです.

于 2020-04-26T18:57:48.393 に答える
0

同様の構造を持つ soap/xml 転送サービスを作成したところ、情報が 2 つのパケットで送信されることがわかりました。メッセージの 2 つの半分を検出して元に戻すには、コードを更新する必要がありました。このペイロード サイズの問題は、udp の問題というよりも HTTP の問題である可能性がありますが、ログを追加して、受信しているすべてのものを書き出すことをお勧めします。今得ているものをログに記録しているように見えますが、失っている 5% を掘り下げる必要があるかもしれません。

その5%ってどうやってわかるの?そのトラフィックを再度送信すると、常に 5% になりますか? 同じメッセージが常に失われます。

ruby と Event Machine を使用して voip/sip 通話データ用の UDP サーバーを構築しましたが、これまでのところ問題なく動作しています。(私はあなたのテストアプローチに興味があります.netcatまたは小さなRubyクライアントを介してすべてを行っていました.10kメッセージを行ったことはありません)

于 2012-06-13T19:34:02.767 に答える