2016-07-07 19 views
0

現在、mongo dbからデータを公開するREST APIを持つノードjsアプリケーションを開発中です。NodeJs App - 反復ジョブ - 1つまたは複数の子プロセス?

アプリケーションは、外部サービスを呼び出すことによって5分ごとに一部のデータを更新する必要があります(新しいデータを取得するのに1分以上かかります)。

私はchild_processにこのタスクを分離することを決めたが、私はこの子プロセスに置く必要があるのか​​について確認していない:

  • に実行される機能のみ。スケジュールはメインプロセスによって管理されます。
  • 5分ごとにデータを自動更新し、更新が実行されるたびにメインプロセスにメッセージを送信する独立したプロセスがあります。

5分ごとに新しい子プロセスを起動するか、私は問題をoverthinkingていた場合、私は、子プロセスを実行している唯一の長い時間を使うか、必要がある場合、大きなコストがある場合、私は本当に知りません^^

EDIT - 更新タスクが1分以上かかることがあります更新タスク

をInforamtionが、それは私も多く必要としないん非同期で実行よりも(多くの外部のプロバイダーからの情報収集)多くの小さなタスクで構成されてい子プロセスですか?

ありがとうございます!

答えて

1

非同期要求を使用している限り、外部サービスからデータを取得するのにかかる合計時間は関係ありません。重要なことは、そうする際に使用しているCPUの量です。大半の時間が外部サービスの応答やデータの送信を待っている場合、node.jsサーバーはほとんどの時間待機しているだけで、おそらく子プロセスは必要ありません。

node.jsは非同期なので、レスポンスを待っていて、システムリソースが非常に少ない「飛行中」のオープンリクエストが多数あります。

node.jsはシングルスレッドなので、通常は子プロセスの必要性を引き起こすCPU使用量です。外部サービスからの応答を得るのに5分かかるが、その要求を処理して何かを行うには50ミリ秒の実際のCPU時間しかなければ、おそらく子プロセスは必要ありません。

私の場合は、外部サービスと通信するためのコードを独自のモジュールに分けることになりますが、そのような変更が実際にあるデータがあるまで、子プロセスの複雑さは追加しません必要です。


私は本当に新しい子 プロセスを開始するためには大きなコストがある場合は5分ごとを知らないか、私は 子プロセスを実行している唯一の長い時間を使うべきかどうか、私はoverthinkingていた場合問題

新しい子プロセスの起動にはいくらかのコストがかかります。それは巨大ではありませんが、5分ごとにそれをやっていて、それが大量のメモリを必要としないならば、子プロセスを一度起動して、外部サービスを完全に所有し、必要に応じて結果を他のnode.jsプロセスに返信することができます。これにより、2番目のノードプロセスはより自立的になり、2つのプロセス間の唯一の対話ポイントは更新を通信することです。機能と責任の分離は、一般的には良いことと考えられています。マルチデベロッパープロジェクトでは、各アプリで異なるデベロッパーがより簡単に作業できるようになりました。

+0

okいいえ、私はいくつかのブロッキングタスクがない場合、問題(=パフォーマンスの問題)が発生する前にそれについて心配する必要はありませんか? – Thomas

+0

@トーマス - うん、それは私の助言になるだろう。それが必要であるという実際の証拠が得られるまで、物事を複雑にしないでください。 – jfriend00

1

Node.jsには、非同期呼び出しを処理できるイベントドリブンアーキテクチャがあります。したがって、マルチスレッド/プロセスアーキテクチャを使用する典型的なC++プログラムとは異なります。

setIntervalを使用して、のようなフレームワークpromisesのようなフレームワークを使用して、より小さな非同期呼び出しを繰り返し定義できる操作を繰り返し実行することは可能でしょうか?詳細について

参照:

たsetIntervalhttps://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval

たsetInterval()

繰り返し一定 時間で、関数を呼び出すか、コードスニペットを実行します各呼び出しの間の遅延。 intervalIDを返します。

サンプルコード:

setInterval(function() { 
    console.log("I was executed"); 
}, MILLISECONDS_IN_FIVE_MINUTE); 

約束http://bluebirdjs.com/docs/features.html

サンプルコード:

new Promise(function(resolve, reject) { 
    updateExternalService(data) 
    .then(function(response) { 
     return this.parseExtResp(response); 
    }) 
    .then(function(parsedResp) { 
     return this.refreshData(parsedResp); 
    }) 
    .then(function(returnCode) { 
     console.log("yay updated external data source and refreshed"); 
     return resolve(); 
    }) 
    .catch(function(error) { 
     // Handle error 
     console.log("oops something went wrong ->" + error.message); 
     return reject(); 
    }); 
    } 
+0

私はすでにpromiseとsetIntervalを使用していますが、タスクを別のプロセスに分離する必要があるかどうかは疑問です。それは理にかなっていますか? – Thomas

+0

パフォーマンスの問題が発生した場合にのみこれを実行していますか?マルチプロセスノードアーキテクチャは、私にとっては意味がありません。すべてのCPUコアを利用しようとしていますか?あなたのノードアプリケーションが集中的に10個のCPUコアのうちの1つだけを使用しており、プログラムがもう倍率変更できず、おそらくマルチチャイルドのものを試していると分かった場合、おそらく 'lscpu'が最初のようなものかどうかを確かめるでしょう。さもなければコードプロファイリングをするのが良いでしょうか? –

+0

私はその時点でパフォーマンスの問題がないので、私はこの問題を克服しようとしているかもしれません...パフォーマンスの問題もコードのブロックもなければ、イベントループに仕事をさせるだけです。 – Thomas

1

それはあなたのアプリとオートリフレッシュタスク間でどのように結束によって異なります。

自動リフレッシュタスクが、アプリケーションとのやりとりなしにスタンドアローンで実行できる場合は、新しいプロセスとしてタスクを開始することをお勧めします。 child_processを直接使うのは良い考えではありません。spawn/monitor/respawnの子プロセスは扱いにくいので、crontabやpm2を使ってそれを管理することができます。

自動リフレッシュタスクがアプリに依存する場合、child_processを直接使用してスケジュールに合わせてメッセージを送信できます。しかし、まずこの依存関係を解消しようとすると、これはアプリを簡単にし、配備と保守を別々に簡単にします。 1つのマシンで何百ものタスクが実行されるまで、子プロセスは長時間実行されています。

+0

おもしろいので、コミュニケーションをとるための待ち行列を持っていると、私の解決策になるかもしれません!ありがとう – Thomas

+0

親と子のIPCチャンネルは既に組み込まれています:[child.send](https://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle_options_callback) – tangxinfa

+0

ええ、私はそれを見ましたが、親子プロセスがあれば動作します – Thomas

関連する問題