2012-02-04 6 views
1

従来、サーバー上で行われていた処理を、node.js Webアプリケーションのクライアントではなく処理するという実際の影響について、いくつか意見を述べたいと思います。node.jsサーバーのJavaScript処理をクライアントに移動する

例のケーススタディ: ユーザーは自分の銀行取引明細書の項目の価値は年を含むCSVファイルをアップロードします。ファイルを解析し、各エントリを分類し、各カテゴリの累積値を計算して、新たに分類された文をdbに格納し、ユーザに支出分析を表示できるようにします。

エントリは、説明の一致する文字列によって分類されます。多くのカテゴリと多くのエントリがあり、処理にかなりの時間がかかります。

私たちのnode.jsサーバーでは、ネットワークの応答などを待っている間にイベントループを自由に解放することができますが、データの破損などの処理があると、サーバーは要求への応答をブロックされます。これは避けられないようです。

伝統的に、CSVファイルはサーバーに渡され、サーバーは処理し、dbで保存し、処理の出力を戻します。

この処理は、ブラウザによって処理され、出力が表示され、保存されるようにサーバーに送信され、当社のシングルスレッドのNode.jsサーバに意味をなすようです。もちろん、これが完了している間、クライアントは待機する必要がありますが、その処理によってサーバーが他のクライアントからの要求に応答することが妨げられることはありません。

誰かがこのモデルを使用してアプリケーションを構築した経験があるかどうかを調べることに興味があります。

だから、質問は..です処理するために、サーバーではなく、ブラウザを得ることに何か問題があり、可能な限り、イベントループを遮断する任意の処理?これはnode.jsアプリケーション開発のための良い/分かりやすい/実行可能なアプローチですか?

+0

1年分の銀行口座情報は、処理、クライアントまたはサーバーに2ミリ秒以上かかることはありません。 – Pointy

+0

['process.nextTick()'](http://nodejs.org/docs/latest/api/process.html#process.nextTick)を使用してサーバー側の処理を分割することができますので、他の処理に反応します処理中のリクエスト - 数行を処理し、残りの作業を次のチックに委譲します。 –

+0

カテゴリがたくさんある場合は、それぞれが数百の可能性のある一致を持ち、各エントリはそれぞれに対してテストする必要があります。とにかく、ポイントではありません。悪い例であろうとなかろうと、問題は処理するクライアントに大量の処理操作を与えるという一般的なアプローチのほうがあります。 @JoeWhiteあなたの助言に感謝します.. nextTick()を見てください – hacklikecrack

答えて

1

完全に可能が、単にクライアントマシンに処理を移行することは、基本的な問題を解決していません。

これで、クライアントのイベントループがブロックされ、ユーザーはブラウザとやり取りできなくなりました。ブラウザはこの問題を検出し、ページのスクリプトの実行を完全に停止する傾向があります。あなたのユーザーが間違いなく嫌いなもの。

作業負荷を委任または分割する方法はありません。 サーバー側の数値処理に2番目のプロセス(たとえば2番目のノードインスタンス)を使用すると、オペレーティングシステムで2番目のCPUコアを使用できるという利点があります。理想的には、サーバーにCPUコアを持つ数のNodeインスタンスを実行し、それらの間の作業負荷のバランスをとることが理想的です。ノードでマルチプロセス通信を実装する方法については、diode moduleをご覧ください。

2

は私が信頼クライアント処理されたデータは良いアイデアだとは思いません。

代わりに、独立したプロセスがリッスンする作業キューを作成し、HTTP要求を処理するnode.jsプロセスからCPU集約型タスクを分離する必要があります。


私の提案されたデータフローは次のようになります。

  1. HTTPのアップロード要求
  2. アプリケーションサーバは「CSV」作業キュー
  3. 通知(生のどこかにワーカープロセスがアクセスできるファイルを保存します)
  4. ワーカーはアップロードされたcsvファイルを処理します。
関連する問題