2013-06-17 12 views
13

私は現在、Apacheやサーバー管理とのやりとりがないPHPのバックグラウンドからノードを使用する方法を学んでいます。私は、ノードプロジェクトをホストするためにHerokuを使用しています.Cloud9 IDEから直接プッシュしました。Node.js単一プロセスのHerokuでの子プロセス

私が読んだことから、Heroku dynoは単一のWebプロセスであり、追加のdynosを購入すると、増加するdynosによって対処可能な要求量のサイズが増えるため、いつでも一緒に。

私はノードがリクエストを1つずつ扱うシングルスレッドシステムであることを知っています。これは、処理に時間がかかる(データベース要求やファイルの処理など)何かのために子プロセスを生成できるようにします。

だから私は単一のdynoで子プロセスを生成するとHerokuでどうなりますか?これは別のdynoを使う必要はありませんか? Nodeが単一のプロセスを実行していて、単一のdynoで利用できるプロセスが1つしかない場合は、余分なプロセスもそのプロセスで処理する必要がありますか?

これは間違っていますか?

+1

データベースリクエストとファイル処理を非同期的に行うために、別々のノードプロセスを起動する必要はありません。そうしなくても、nodejsの利点があります。非決定的な数のワーカー「スレッド/プロセス」を生成する場合は、NodeJSを間違って使用しています。そしてその答えで、私はあなた自身の質問に答えることができるはずだと信じています。詳細をご希望の場合はお知らせください。 – ChrisCM

+0

あなたのお返事ありがとう、Chris。私は自分自身を正しく説明していないかもしれません。ノードの知識は、ノード初心者の本で詳しく述べられていないほど広がらず、 'var exec = require(" child_process ")。exec;'高価なシェル操作を実行して非ブロッキングコードを示すために 'exec'関数を使用します。したがって、この例では、メインプロセスが新しい要求を引き続き受け取り、後で初期要求の応答を表示するコールバックを受け取ることができるように、シェル操作が別のプロセスに遅延されています。 – mibbler

+0

私は答えとして私のコメントを提出しました。 – ChrisCM

答えて

7

あなたの理解が大まかに正しいです、私の懸念は、あなたがそうする必要がないときにそれを使用しているということです...あなたの質問では、それは事を行うシングルスレッドのイベントモデルです。シングルスレッド化されているにもかかわらず、イベントモデルでは、メインイベントループをブロックせずにコードを実行することができます(CPU使用率が高いVERY CPUを使用していない限り...データベース要求とファイル処理は含まれません)。あなたが望むことをするために追加のdynoを起動する必要はありません。

dynoをシングルプロセッサコンピュータと考えてください。シングルプロセッサーを搭載したマシンで何ができるのかは、追加料金やダイノスを使用せずにダイノーで行うことができます。しかし、dynoは、単一のコアプロセッサコンピュータが利用できるメモリよりもかなり少ないメモリしか持っていません。したがって、あなたがスポーンしたい任意のサブプロセスは、別のdynoを実行する必要はありません。あなたが実行したいすべてのマスタープロセスは、独自のdynoを必要とします。

var http = require('http'); 

http.createServer(function (req, res) { 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('An amount of data that will take 1 second to send');//This will not block the event loop 
}).listen(1337, '127.0.0.1'); 

var http = require('http'); 
http.createServer(function (req, res) { 

    while(true) { 
     break after 1 second; //this will block the event loop for 1 second 
    } 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

上記のコードの2つのサーバーを考えてみましょう。両方のサーバーは、約1秒の作業が必要です。最初の例では、1秒間に何千もの要求を処理できます.2番目の例は1です。データ、データベース要求、サーバー要求、ファイルIOなどを送信すると、すべてが最初の例として動作します。 2番目の例。 2番目の例のようなものがあれば、別の言語を選ぶほうが良いでしょう。それは非常にうまく設計されていないユースケースのためにノードを動作させることです。

+0

ああ、大丈夫です。だから、私はシングルスレッドでシングルプロセスを間違っていたようだ。1つのdynoで実行できるプロセスの量に制限があるかどうかを知っていますか? – mibbler

+0

豊富なプロセスを立ち上げることを強くお勧めしたいと思います。あなたのノードプロセスがプロセッサーのために1人か2人以上のワーカーを立ち上げる必要があると思われるならば、ノードを正しく使用していない可能性があります。あるいは、異なるプログラミング言語に適したユースケースです。私はあなたのために少しデモのコードを書いていきます。言われているように、この数は、あなたが置いておきたいどんな制限でもなく、英雄が使用しているオペレーティングシステムによってのみ制限される可能性があります。 – ChrisCM

+1

あなたの真の限界は、おそらくRAMです。 Dynosは512MBのRAMをサポートすることができます(最後に確認しましたが、もう少し前です)。プロセスをフォークすると、そのプロセスのメモリが自分の環境にコピーされます。したがって、100MBのプロセスを仮定すると、5つのプロセスを生成することができます。 (ここでの数学は正確ではありませんが、これは単なる概観に過ぎず、ベンチマーキングは順序通りであるかもしれません) – ChrisCM

関連する問題