Nodejsの安定性を向上させる方法

青灯夜游
リリース: 2022-01-13 17:03:51
オリジナル
2315 人が閲覧しました

nodejs の安定性を向上させる方法: 1. 適切なコード構造を維持する; 2. "try~catch" を使用して例外をキャッチする; 3. ドメイン モジュールを使用してプログラム例外を処理する; 4. log4js を使用するログを記録するモジュール; 5.nodejsを管理するにはforeverモジュールを使用します。

Nodejsの安定性を向上させる方法

#このチュートリアルの動作環境: Windows7 システム、nodejs バージョン 12.19.0、DELL G3 コンピューター。

nodejs プログラムの安定性と堅牢性の向上

インターネット上の投稿をいくつか見て、nodejs プログラムの安定性について不満を言いました。なぜ?まず、おそらくこれは JavaScript と関係があると思われます。Node は JavaScript で実装されており、JavaScript は「世界で最も誤解されている言語」としても知られています。nodejs の創設者の発言を見てみましょう。この記事では、node はなぜ JavaScript を使用して実装するのでしょうか? 次に、nodejs は結局のところまだ若いものであり、公式 Web サイトにはいくつかのモジュールでこのモジュールの現在のステータスも記載されています。

過去 2 日間、この問題について考えるのに少し時間がかかりました。プログラムの最初の関数は独立しているべきだと思います。1 つの関数が異常であっても、他の正常な関数に影響を与えるべきではありません。プログラム全体をクラッシュさせます。次に、プログラムがクラッシュした場合でも、プログラムが自動的に起動するようにする必要があります。さらに、問題を追跡しやすくするためにログを記録する必要があります。私は、nodejs の安定性は主に次の側面から改善できると考えています:

1) 適切なコード構造を維持する:

node がシングルスレッドであることはわかっています。ノンブロッキング io、デフォルト 非同期であり、後続のプロセスはコールバックによって処理されます。ネストされたレベルが多すぎると、必然的にコードの論理構造に混乱が生じ、メンテナンスやアップグレードに役立ちません。非同期プロセス制御モジュールである async を使用して、コード ロジックを明確にすることができます。

2) process.on('uncaughtException', function(err){...}); を使用して、捕捉されなかったエラーを処理します。

3) try~catch を使用して例外をキャッチします:

これは問題の一部のみを解決でき、すべてを解決できるわけではありません。シングル スレッド、ノンブロッキング IO、デフォルトで非同期、コールバックを通じて後続のプロセスを処理します。try~catch はコールバックのエラーをキャプチャできません。コールバックのエラーをキャプチャするにはどうすればよいですか? ドメイン モジュール

を使用できます。

4) プログラム例外を処理するためにドメイン モジュールを使用する

まずドメインの説明を見てみましょう。ドメインは EventEmitter クラスのサブクラスです。エラー イベントをリッスンして、キャプチャしたエラーを処理します。これは、複数の異なる IO 操作を 1 つのグループとして処理する方法を提供します。ドメインに登録されているイベント トリガーまたはコールバックが「エラー」イベントをトリガーするか、エラーをスローする場合、ドメイン オブジェクトに通知されます。このエラーのコンテキストは `process.on('uncaughtException')' ハンドラーから直接失われるのではなく、エラー コードを伴うこのエラーのためにプログラムがすぐに終了することはありません。

ドメイン モジュールの使用方法は?例を見てください:

serverDomain.run(function() {
  // 服务器在serverDomain的作用域内被创建
  http.createServer(function(req, res) {
    // req和res同样在serverDomain的作用域内被创建
    // 但是,我们想对于每一个请求使用一个不一样的域。
    // 所以我们首先创建一个域,然后将req和res添加到这个域上。
    var reqd = domain.create();
    reqd.add(req);
    reqd.add(res);
    reqd.on('error', function(er) {
      console.error('Error', er, req.url);
      try {
        res.writeHead(500);
        res.end('Error occurred, sorry.');
      } catch (er) {
        console.error('Error sending 500', er, req.url);
      }
    });
  }).listen(1337);    
});
```
ログイン後にコピー

説明: 最初にドメインを作成し (domain.create())、次に監視する必要があるディストリビュータをドメインに追加し、最後にエラー イベントをドメインにバインドします。監視できること。

別の例を見てください:

var d = domain.create();
d.on('error', function(er) {
  console.error('Caught error!', er);
});
d.run(function() {
  process.nextTick(function() {
    setTimeout(function() { // 模拟几个不同的异步的东西
      fs.open('non-existent file', 'r', function(er, fd) {
        if (er) throw er;
        // 继续。。。
      });
    }, 100);
  });
});
ログイン後にコピー

手順: まずドメインを作成し、エラー イベントをドメインにバインドして、ドメインのコンテキストで実行できる関数を提供します

If コールバックについてはどうですか?このように使用できます

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});
ログイン後にコピー
ログイン後にコピー

もちろん、次のように使用することもできます

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});
ログイン後にコピー
ログイン後にコピー

この関数は、domain.bind(callback) とほぼ同じです。ただし、スローされたエラーを捕捉するだけでなく、この関数に最初の引数として渡された Error オブジェクトもインターセプトします。

5) log4js モジュールを使用してログを記録する

Log4js は非常に強力なログ管理ツールです。この github プロジェクトをチェックアウトできます: https://github. com /nomiddlename/log4js-node

6) Forever モジュールを使用して nodejs を管理します

Forever は、コマンド ライン ツールである nodejs をサーバー側で管理するためのモジュールです。アプリを停止します。 Forever は完全にコマンド ライン操作に基づいており、forever プロセスの管理下でノードのサブプロセスが作成され、ノードのサブプロセスの実行状態がモニターを通じて監視されます。プロセスがハングすると、永久にノード サーバーが自動的に再起動され、アプリケーションが正常であることを確認します。非常に使いやすいです。

このプロジェクトに注目してください: https://github.com/nodejitsu/forever

しかし、永遠は万能薬ではなく、次のような問題もあります。問題:

    監視およびログ機能の制限
  • プロセス管理構成のサポートが不十分
  • クラスターのサポートなし
  • コード ベースが古くなっています (つまり、node.js のアップグレード後に頻繁に失敗します)
この記事にはテスト コードが添付されています: https://github.com/yupeng528/node-error

その他のノードについて-関連の知識については、

nodejs チュートリアルをご覧ください。 !

以上がNodejsの安定性を向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート