web-dev-qa-db-ja.com

Node.jsクラスタリングと複数のDockerコンテナー

私の理解では、Dockerコンテナーは複数のスレッドを使用し、Node.jsアプリケーションは単一のスレッドのみを使用します。 Node.jsクラスタリングを処理する pm2 のようなものを実行することで、Dockerコンテナーで使用可能なすべてのコアを利用できます。

これは、Node.jsプロセスをクラスター化することで、各Dockerインスタンスをより多く利用できることを意味しますか?もしそうなら、これはコンテナごとに単一のスレッド化されたNode.jsインスタンスを単に実行するよりも好まれませんか?

懸念されるのは、Dockerコンテナが実行中のCPUの数を拡大または縮小する可能性によって引き起こされる副作用があるかどうかです。

11
Sawtaytoes

端的に言えば、複数のコンテナーは、クラスターをサポートする単一のコンテナーよりもはるかに優れたパフォーマンスを発揮するように見えます。決定的なものではありませんが、次の点を確認してください。 複数のDockerコンテナを使用する場合のパフォーマンスと信頼性VS標準Node cluster

4
stefanobaldo

まず、ノードクラスターを実行するために基本的にpm2は必要ありません。ノードには、マルチコアマシンを利用するための組み込みの クラスターモジュール が付属しています。また、インスタンスのスケールダウンは、ワーカーの数をハードコーディングしない限り、実際には影響しません。クラスターを使用してワーカーを生成する方法を理解するには、クラスターモジュールのサンプルコードを参照してください。

0
Avinash

別のDockerコンポーネント内でNodeJSをクラスタリングすることについて話している場合、それが追加のブーストになるとは思いません。あなたが言ったようにNodeJSはシングルスレッドで実行されるので、pm2(私は実際にそれを使用します)またはdockerのどちらかが負荷の分散に関して同じ効果を持ちます。

NodeJSには、着信リクエストの処理方法を処理するWebワーカーの概念がありますが、非ブロッキングアーキテクチャであるため、それほど高速ではないサーバーでも数百のリクエストを処理します。

私はまだDockerを掘り下げる必要があることを認識していますが、時間がありませんが、サーバーごとに1つのDockerイメージ(仮想または物理)を用意し、pm2でノードの複数のインスタンスを内部で実行する必要がありますそれ。

これは、Dockerに依存関係を処理させ、pm2にクラスター管理を処理させたいためです。これは、メモリがターゲットに到達したときに自動的に再起動したり、エラーが発生したノードを再起動したりするなどの優れた機能を備えているためです。

0
sfratini