2

Cluster のようなものを使用して複数のワーカーをフォークまたは開始する場合:

  1. ノードプロセスの複数のスレッドまたはインスタンスが作成されていますか? これはノードのシングル スレッドの概念を破りますか?

  2. リクエストはワーカー間でどのように処理されますか? Cluster は、すべてのリクエストを複数の worker に負荷分散するインテリジェントなメカニズムを提供しますか?

4

2 に答える 2

6

Clusterを使用しfork、はい、自動的にバランスが取られます。

ワーカープロセスはchild_process.forkメソッドを使用して生成されるため、IPCを介して親と通信し、サーバーハンドルを前後に渡すことができます。

[...]

複数のプロセスがすべてaccept()同じ基盤となるリソース上にある場合、オペレーティングシステムはそれらの間で非常に効率的に負荷分散します。Node.jsまたはプログラムにはルーティングロジックはなく、ワーカー間で状態を共有することもありません。したがって、セッションやログインなどのメモリ内データオブジェクトに過度に依存しないようにプログラムを設計することが重要です。

新しいnode.jsインスタンスを別のスレッドとしてカウントすると、これはnode.jsシングルスレッドの概念を破ると思うかもしれませんが、特定のリクエストへのすべてのコールバックは同じnode.jsインスタンスで処理されることに注意してください。accept元のリクエストを編集しました。競合状態や共有データはなく、かなり安全なプロセス間通信のみです。

詳細については、クラスターのドキュメントを参照してください。

于 2013-02-25T15:19:19.430 に答える
3

Clusternode.jsのシングル スレッド アーキテクチャを補うために開発されました。最新のプロセッサには複数のコアがあり、シングル スレッド プロセスでは使用可能なコアを活用できません。シングル スレッド アーキテクチャからは逸脱していますが、それに固執する計画はありませんでした。主な概念は、非同期のイベント駆動型の実行でした。

クラスターは fork を使用してプロセスを作成します。フォークされたプロセスは、実際には独自のアドレス空間を持つ独自のプロセスです。(スレッドとは異なり) 親または兄弟のアドレス空間に影響を与えるために子が (通常) 実行できることはありません。通常の ChildProcess インスタンスにすべてのメソッドがあることに加えて、返されるオブジェクトには通信チャネルが組み込まれています。フォークされたすべてのプロセスは、このチャネルを使用して通信できます。

ここでの微妙な違いに注意してください。そうではなくmulti-threaded、新しい独立したプロセスを作成するためにフォークするだけです。Linux のスレッドとプロセスを比較するには、こちらを参照してください。各ワーカーは、以前と同様にシングル スレッド アーキテクチャを想定しています。そのため、ノードのシングル スレッドの概念が崩れることはありません。

負荷の分散は、コード自体 (それぞれが独立しているため) と OS に依存します。負荷は、OS によって、分岐されたすべてのプロセスと元のプロセスの間で均等に分散されます。

しかし、別の方法でやりたい場合は、それも可能です。マスター スレッドをワーカーとは異なる方法で使用する場合、または各ワーカーが異なるタスク (圧縮/ffmpeg) に特化している場合は、それを行うことができます。

于 2013-02-25T16:23:05.927 に答える