2013-07-30 21 views
5

私は、私がやっているプロジェクトにnode.jsを使い始めています。CPU負荷の高いタスクの子プロセスですか?

クライアントがリクエストを行うと、私のnode.jsサーバーは別のサーバーからjsonを取り出し、それをこのクライアントに配信される新しいjsonに再フォーマットします。しかし、ノードサーバーが他のサーバーから取得したjsonは、潜在的にかなり大きく、データの「マッサージ」がかなりCPUに集中する可能性があります。

私は過去数時間、node.jsがどのようにCPUのタスクに適していないのかを見てきました。私が見てきた主な応答は、子プロセス(基本的に.jsファイルがメインイベントループをブロックする可能性があるCPU集中型タスクを処理する、ノードの別のインスタンス)。

20,000人の同時ユーザーがいるとします。つまり、これらの子プロセスを実行しているときに20,000個のOSレベルのジョブが生成されます。

これはいい考えですか? (別のWebサーバーでは、同じプロセスで2万のスレッドが作成されます)。

子プロセスを実行する必要があるかどうかはわかりません。しかし、私は非ブロックCPU集約的な仕事をする必要があります。私が何をすべきかのアイデア?

答えて

-2

ソリューションの設計方法がわからない人は、

NodeJSはまさにそれがノードであり、そのように扱われるべきです。

あなたの例では、ノードインスタンスは外部apiに接続し、jsonを取得して処理して戻します。 JSON 3.ポスト// server.com/postJSON

だからあなたは何をしますか

すなわち 1.取得// server.com/getJSON 2.プロセス? 自分自身に時間の問題であると尋ねますか?そうであればノードは解決策ではありません 4秒で1回のリクエストではなく、処理能力を生かすことにもっと興味がある場合

200リクエストは10秒で完了しますが、 10秒。

JSONがマッサージにかかる時間を診断します(1秒未満の場合)。 1の代わりに4つのノードインスタンスを実行してください。

しかし、それより複雑な場合は、jsonを処理するセグメントに分割してください。そして

process.nextTick(関数(doprocess(セグメント1)各セグメントを処理するために非同期コールバックを使用して、process.nextTick(関数(){doprocess(SEGMENT2)

各doProcessは次doProcess

ノードを呼び出しjsが要求間の時間を交換します。

あなたは非常にスケーラブルでコスト効率のsolutioを持っている今、その解決策を取るとあまりにもサーバあたり4つのノードのインスタンスを、それを拡張し、2-5サーバ

と突然n。

+0

jsonファイルをセグメント化し、サーバーごとに4つのノードインスタンスを作成し、2-5つのサーバーを作成しますか?今私は非常に拡張性とコスト効果の高いソリューションを持っていますか? ..おまえ、 – foreyez

+0

それはより簡単です。 2〜5台のサーバーは膨大な量のスループットに対応しています。あなたがどこから来たのか分からない。 NodeJSは、システム内のノードのように使用するために構築されたもので、必要なものを実行するために最低限必要なものです。スケーラビリティのための事前解決されたソリューションではありませんが、それを使用して非常に優れたシステムを構築できます。 – miketheprogrammer

8

Nodeに電源を供給するV8 Javascript Engineは、実際にはpretty fast comparedto manyserver-side languagesです。

ノードのイベントモデルはcooperative multitaskingと非常によく似ています。特定のリクエストの操作は、Javascriptイベントループに制御を戻すまで続行されるため、高いCPUタスクがループをブロックします。ユーザーは完璧なパフォーマンスを得ることになり、別のグループは、負荷をかけて正常にパフォーマンスが低下するのではなく、タイムアウトになります)。

ので、CPU集約型のタスクのために、あなたが使用できるいくつかのソリューションがあります

  1. あなたは処理パイプラインのようなコードを扱うことができ、単にprocess.nextTick処理の大きな塊との間の平均待ち時間を短縮するために(基本的にはより協調的で、長い間CPUを要求することはありません。
  2. 作業が純粋なJavascript(ノードモジュールは不要)の場合は、node-webworker-threadsライブラリを使用して、CPU集約型の作業をスレッドにオフロードできます。しかし、常に新しいスレッドを生成することはおそらく悪い考えです。したがって、これらのワーカーがキューから取り込んで、キューに戻って出力するようにエンキューするスレッドのプールが必要になるでしょう。いずれの場合でも...
  3. 子プロセスのワーカーのプールを作成し、同じキューイングメカニズムを使用します。プールのサイズは、CPU集中型のパスを必要とする要求の割合、要求の総数、および許容可能なこれらの要求に許容される待ち時間の増加。
関連する問題