ああ、それはトリッキーな質問です。まず、Node プロセス全体の再起動を強制しないという点で、domains
アプローチは とは異なります。forever
たとえば、Node アプリケーションが複数のクライアントからのリクエストを同時に処理するとします。ドメインを慎重に構成することで、(少なくとも理論上は) リクエストの 1 つがエラーをスローしたときに他のリクエストが失敗するのを防ぐことができます。
ただし、実際には、ドメインを機能させるには、アプリケーションの一部のコンポーネントを認識させる必要がありますdomain
。これは、サードパーティ コンポーネントにも当てはまります。たとえば、接続のプールを内部で使用するデータベース接続モジュールは、それらを独自のドメインにラップするのではなく、コールバックにすでにドメインがアタッチされているかどうかを確認する必要があります。そうしないと、データベース コードでスローされた例外がモジュール自体のドメインでキャッチされ、ドメインはそれを認識できません。したがって、サードパーティのコードでドメインを使用するには、そのコードがdomains
念頭に置いて作成されているかどうかを最初に確認する必要があります。
forever
クラッシュするたびにアプリケーションを再起動するだけです。よりも悪い考えのようにdomains
思えますが、サードパーティのコードに対して特定の要件を課すこともありません。したがって、必要なライブラリまたはモジュールを使用できます。また、複雑なエラー回復ロジックをコードに入れる必要もありません。障害のない複雑なコードベースよりも、単純なコードベースの方が重要な場合があります。
私はそれprocess.on('uncaughtException')
を使用しません。現在は廃止されているため、いつか削除される可能性があります。
これが私の内訳です:
forever
長所:
- コードベースをよりシンプルで小さく保つことができます
- 最初にアプリケーション ロジックを記述し、後でエラー処理について考えることができます
短所:
- キャッチされなかった 1 つの例外により、他のすべての要求が失敗する
次の場合に使用します。
- Nodeプロセスとリクエストは安価です
- クライアントはエラー時に再試行できます
domains
長所:
短所:
- ドメイン対応のサードパーティ ライブラリで使用可能
- プログラムに追加のロジックが必要
次の場合に使用します。
- リクエストまたは Node プロセスは高価です (ファイルのアップロード、データのストリーミングなど)。
- 単一ノードのアップタイムが重要
process.on('uncaughtException')
使用しないでください。
ノート
Isaac Z. SchlueterとFelix Geisendörferが NodeUp の第 13 回エピソードでドメインについて話しました
と Unix の の違いを説明した最近の記事forever
systemd
があります。役に立つかもしれません。