2012-04-12 3 views
5

私はCodeIgniterを使用してPHPでいくつかの大きなプロジェクトを構築したPHP Webアプリケーション開発者です。 PHPは常に仕事を終わらせましたが、私はクライアント側でjavascript extjs4フレームワークを使って構築している新しいプロジェクトに取り組んでいます。経験豊富なnodejs開発者にはいくつか質問があります。特定の状況でPHP開発者にnodejsスタイルの開発を説明してください

私の最近のPHPプロジェクトでは、ユーザーログイン要求で私のサーバーはFacebookへのAPIコールを行う必要がありました。私がこれを処理してスケーラビリティーを向上させる方法は、私のクライアントが最初のログイン要求を行い、サーバーが要求をギアマンジョブキューイングサーバーに渡し、バックグラウンドワーカープロセスがジョブを取得しAPI呼び出しを実行するというものでした。その間、サーバーはクライアントに応答し、クライアントのブラウザはAJAXでサーバーをポーリングして、ジョブが完了したかどうかを確認します。 (ああ、Facebook APIコールの結果をワーカーからmemcachedを使用してアプリケーションサーバーに渡しました)。 PHPをロックしてからFacebook APIの呼び出しに数秒かかるため、アプリケーションサーバーを解放してユーザーからのより多くの同時リクエストを処理しました。

私の質問は、nodejsが非ロックであるため、AppServer、ギアマンジョブキューイングサーバ、およびバックグラウンドワーカーのこのモデル全体がnodejの開発に意味があるのですか?クライアントからのログイン要求を受け入れ、アプリケーションサーバーからfacebook APIを呼び出し、レスポンスを待つ(nodejsがロックしていないので他のユーザーのリクエストを処理している間に)、ユーザーに返信しますか?

素晴らしいheroku環境を利用できるようにnodejs開発に着手することも考えています。

+1

私は同様の状況にあります。 – Dhiraj

答えて

2

答えは「はい」です。ノードシステムで通常これを処理する方法は、正確に記述する方法です。

ノードがノンブロッキングであるため、イベントループは常に実行可能なリクエストを監視しています。ここで使用した例がありますすべての大騒ぎがノードと何であるか、あなたが想像できるように

console.log('start'); 

    client.graphCall(path, params, method)(function(result) { 
    // fires whenever request is completed 
    console.log('facebook returned'); 
    }); 

    console.log('end'); 

出力

start 
    end 
    facebook returned 

が、これは基本的にnode-facebook-client(FacebookのAPIを使用するように構築された多くのnpmモジュールのいずれか) (それは本当に速いです)。つまり、学習曲線はノード非同期実行でもあります。それが必要とされるとき「末端は」「Facebookのリターン」の後に来る必要がある場合は、あなたが

console.log('start'); 

    client.graphCall(path, params, method)(function(result) { 
    // fires whenever request is completed 
    console.log('facebook returned'); 
    console.log('end'); 
    }); 

またコールバックにそれを置く必要があるだろう、それは、を含むアプリケーションに動的な子プロセスを統合する基本です追加のノードプロセスchild_process.forkためofficial docsから:

var cp = require('child_process'); 

var n = cp.fork(__dirname + '/sub.js'); 

n.on('message', function(m) { 
    console.log('PARENT got message:', m); 
}); 

n.send({ hello: 'world' }); 

そして、子スクリプト、 'sub.js' は、このようになります。

process.on('message', function(m) { 
    console.log('CHILD got message:', m); 
}); 

process.send({ foo: 'bar' }); 

子でプロセスオブジェクトは、送信を持っています()メソッドを呼び出すと、プロセスはそのチャネル上でメッセージを受け取るたびにオブジェクトを送出します。

+0

ノードjsのWebプロセスがAPI呼び出しのような長時間実行される操作を処理できる場合でも、ワーカーは信じられないほどワーカープロセスを使用することになります要求とロックしていない? –

+2

ワーカースレッドを使用することは、複数のワーカーを作成することによって、(サーバーの過負荷に対抗するための)作業負荷を軽減するだけでなく、作業負荷を増加させることにも非常に便利です。 – Alfred

+1

ノード・アプリケーションを複数のプロセスに複製し、 'cluster'という別のネイティブ・モジュールを使用してそれらの間でロード・バランシングを行うことは非常に一般的です。これはワーカーがTCPサーバーを共用できる' child_process.fork'の単なるラッパーです。非ブロッキングであっても、一度に1つのノードプロセスで1つのことしか実行できないため、複数のプロセスにレプリケートすると同時性が向上します。 –

関連する問題