2016-03-01 2 views
6

Node.jsサーバーを使用して、メインプロセスではなく、委任されたワーカープロセスです。これらのワーカープロセスは、Node.jsサーバ自体でも、Node.jsのIPC経由で通信する子プロセスでもかまいません。"Node.jsによるダイレクトレスポンス" - 異なるNode.jsプロセスによるHTTPレスポンスの送信(メインプロセスと異なる)

クラスタコアモジュールhttps://nodejs.org/api/cluster.htmlは、そのモデルではすべてのワーカーが同じポートでリッスンしているため、マスタープロセスに代わってすべての要求を処理するので、私がやりたいことはできません。私が探しているのは、すべてのHTTPリクエストに応答し、認証を行い、いくつかのリクエストを処理するNode.jsプロセスですが、データ集約型またはCPU集中型のリクエストをワーカー・プールに委任することもできます。

大量のデータ、たとえば2〜3MBのGETリクエストがあるとします。

  1. メインプロセスは、要求を受信した大量のデータのためのデータベースを要求し、その後リクエスタに戻ってデータを送信する:

    我々は、少なくとも3つの可能なシナリオを持っています。

  2. メインプロセスは要求を受信し、IPCを使用してワーカープロセスにデータを送信し、ワーカーはDBからデータを取得して重い操作を行い、次にワーカーはIPCを使用して3MBのデータをすべてメインに戻しますプロセスは、応答を返送します。
  3. メインプロセスが要求を受信し、要求ストリームに関する情報をできるだけ少量でワーカーに送信します。ワーカーはすべての作業を行い、ワーカーはHTTP応答を返します。

私は特に#3を作ることに興味があります。

シナリオ3の簡単な描写は以下の通りです:

enter image description here

(ただ、明確にするために、私は1つの要求のために3つの応答をしたくない、私はちょうどおそらく労働者ができたことを示すためにしようとしていますメインプロセスの代わりに応答を送信する)。

これはNode.jsでどのように動作するのでしょうか。どのように他の言語で動作する可能性がありますか?通常、Node.jsの同時実行モデルには問題はありませんが、いくつかのタイプのデータでは、クラスタモジュールを使用することはおそらく最高レベルの並行性を実現する最良の方法ではありません。

このモデルの用語の1つは「直接応答」です。これは、作業者が要求に直接応答することを意味します。そしておそらく、単にクラスタコアモジュールhttps://nodejs.org/api/cluster.htmlをこのために使用することは可能です。

+0

私は多少似たようなアイディアを持っていましたが、広範囲の検索の後に、これを使って達成しようとしているが、アプリ全体を回転させることなく、ロードバランサとしてnginxを使用しました。私は誰にも何かがある場合、ソリューションについても知っていることに興味があります。 – shriek

+0

確かに、cluster.setupMasterは私がしたいことをすることができるかもしれませんが、私はまだ分かりません、https://nodejs.org/api/cluster.html#cluster_cluster_setupmaster_settings –

+1

を参照してください。受け入れられた答えはこちら:http://stackoverflow.com/questions/23771516/using-cluster-in-a-node-module/24463511#comment59142347_24463511 –

答えて

0

ことが可能でもあると委任ワーカープロセスから

をHTTPレスポンスを送信することをお勧めしますはい、これはおそらく、あなたのアプリケーションサーバーをスケールアウトする最も簡単な、最も一般的な方法も可能であるし、場合、私は疑問に思って。 IPCとは異なり、ネットワークを介してホスト間で動作することができます。 JavaScript自体がシングルスレッドであるにも関わらず、ほとんどのIOライブラリとNPMモジュールはスレッドプールを使用していますが、実際にはアプリケーションでCPUバインドされていることを確認してください。 )

Nodeを使用する理由はありません。jsをバックエンドサーバー間のサーバー負荷分散として使用します。アプリケーションサーバーにはNode.jsが適しています。ちょうどHTTPリクエストをプロキシするために、私はNginxなどを使用したいと思います。 Nginxは、クライアントとのすべての処理を効率的に処理することができ、ロードバランスを容易に設定できます。

0

あなたはあなたのマシンで複数のプロセッサを活用しようとしている場合(複数可)(実行ノード自体によっては、単一のプロセスを使用しています)、単にPM2を使用します。

https://www.npmjs.com/package/pm2

PM2は、あなたの様々なインスタンスを開始あなたがPM2に指示するプロセッサ上のアプリケーション。アプリケーションがステートレス(理想的にはノードを使用しているため)の場合、アプリケーションのインスタンスが各プロセッサで実行され、PM2がルーティングを行います。

シナリオ3で投稿した図を言葉で再描画することができれば、PM2は「MAIN」の代わりになり、「W」はアプリに置き換えられ、ワーカーやフォークを心配する必要はありません。

私たちはPM2をプロダクションで使用しています。

関連する問題