6

私はnode.jsに比較的慣れていません。それに関連して質問があります。私が理解している限り、node.jsはイベント駆動パラダイムを使用しているため、単一のスレッドのみを生成し、すべてを非同期に処理します(イベント駆動方式)。これにより、リソースの消費を抑え、多数の同時接続を処理できます。

ただし、これに関連して 1 つ質問があります。スレッドが 1 つしかないため、未処理の例外が 1 つでもすべてがクラッシュする可能性がありますね。複数のプロセスを使用して複数の接続を処理できる apache のような node.js Web サーバーとは異なり、1 つのプロセスがクラッシュしても問題ありません。

それで、node.jsがそれに適しているかどうかは少し心配です。私はただの初心者です。だから、どんな洞察も役に立ちます

4

2 に答える 2

3

アナロジーを使用して、この比較的新しいテクノロジーを説明しましょう。レコードプレーヤーと10人のユーザー:

PHP マルチスレッド:10個のレコードプレーヤー、各プレーヤーには1つのアームと針があり、各ユーザーには1つのレコードプレーヤーがあります。各ユーザーは、自分のレコードプレーヤーからいくつかのノートを再生します。未処理の例外、またはヒスノイズ=レコードプレーヤーは、ユーザーがアームを持ち上げる/プロセスが閉じるまで再生を続けます。彼らは彼ら自身のレコードプレーヤーを持っているので、他の誰もそれを聞くことができません。そして、彼らはヘッドホンをつけています。

NodeJS:シングルスレッド

ユーザーごとに1つずつ、10本の腕と針を備えた1台のレコードプレーヤー。すべてのレコードプレーヤーがその1台のレコードプレーヤーを共有しています。各ユーザーは、オフレコで同時にいくつかのメモ、プロセスにアクセスします。それは非同期で、誰もが音楽の一部を手に入れます。未処理の例外=1人のユーザーのシューという音、同じいくつかの音にアクセスするユーザーのみ、または例外をスローする同じプロセスでもシューという音が聞こえます。しかし、それはそれについてです。他の誰もがまだ甘い音楽を聞くでしょう。彼らはまだ彼ら自身のヘッドフォンを持っています。

K.これ以上悪い例えはありません。

仮定の問題の解決策は次のとおりです。Node.jsでは、リスナーを「uncaughtException」イベントにアタッチできます。そのため、サーバーを停止する場合、またはまれに停止する可能性がある場合は、問題のあるプロセスを強制終了できます。

于 2012-12-29T07:06:37.247 に答える
2

私はクラスターを使用して、シングル スレッドの信頼性の問題を回避しています。クラスターは組み込みライブラリの 1 つであり、1 つまたは (n) 個のワーカー インスタンスを起動するように構成できます。通常、サーバー内のすべての CPU コアに対してインスタンスを起動します。メイン プロセスは、ワーカー プロセスからのイベントを監視し (プロセスが 100% 正しい用語であるかどうかはわかりません)、終了をキャッチしてログに記録し、ワーカーを再起動します。理想的には、地域に配置された複数の Web サーバーと、Web サーバーを監視し、過負荷または応答がないことを検出し、新しいインスタンスの起動や停止したインスタンスの強制終了などの適切なアクションを実行できるロード バランサーも必要です。

クラスターを使用する一般的なコードは次のようになります (クラスターのドキュメントの例に基づく)。

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Fork workers.
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
        // restart this instance
        cluster.fork();
    });
} else {
    // create an error handler for uncaught exceptions so we can log them
    process.on('uncaughtException', function(err) {
        var date = new Date ();
        var message = date.toString () + ":UNCAUGHT EXCEPTION\n" + err.stack + "\n";
        console.log (message);
        process.exit(1); // we will get restarted by the cluster process
    });
    // Workers can share any TCP connection
    // In this case its a HTTP server
    http.createServer(function(req, res) {
        res.writeHead(200);
        res.end("hello world\n");
    }).listen(8000);
}
于 2012-12-29T21:01:29.827 に答える