web-dev-qa-db-ja.com

NodeJSで長時間実行されるプロセスを処理しますか?

このトピックについて触れている古い投稿を見てきましたが、現在の近代的なアプローチとは何かを知りたいと思いました。

ユースケースは次のとおりです。(1)長時間実行するタスクを実行することを想定しています。 ビデオファイルで、60秒と言う、 いう jspm install最大60秒かかることがあります。 (2)タスクを分割することはできません。

その他の要件は次のとおりです。

  • タスクがいつ終了するかを知る必要がある
  • 実行中のタスクを停止できてうれしい
  • 安定性:1つのタスクが停止しても、サーバーがダウンすることはありません
  • 数百の同時リクエストを処理できる必要がある

私はこれらの解決策が言及されているのを見ました:

現代の標準ベースのアプローチはどれですか?また、nodejsがこのタイプのタスクに適していない場合は、それも有効な答えです。

13
U Avalos

短い答えは次のとおりです。

Nodejs serverを意味する場合、答えはノーこの使用例の場合です。 NodejsのシングルスレッドイベントはCPUにバインドされたタスクを処理できないため、別のプロセスまたはスレッドに作業を外部委託することは理にかなっています。ただし、CPUにバインドされたタスクが長時間実行されるこのユースケースでは、タスクをキューイングする方法を見つけることは理にかなっています。つまり、ワーカーキューを使用することは理にかなっています。

ただし、JSコード(jspm API)、nodejsを使用するワーカーキューを使用することは理にかなっています。したがって、解決策は次のとおりです。(1)ワーカーキューにタスクをキューに入れるだけのnodejsサーバーを使用します。 (2)nodejsワーカーキュー(kueなど)を使用して実際の作業を行います。 clusterを使用して、異なるCPUに作業を分散します。結果は、数百のリクエストを処理できる単純なsingleサーバーです(窒息なし)。 (まあ、ほとんど、以下の注を参照してください...)

注意:

  • 上記のソリューションではprocessesを使用しています。スレッドソリューションはノードに不利になったようですので、調査しませんでした。
  • ワーカーキュー+クラスターはスレッドプールと同等です。
  • 最悪の場合、4コアマシンで100回目の並列リクエストが完了するまでに25分かかります。解決策は別のワーカーキューサーバーを起動することです(私が間違っていない場合、kueのようなdb-backedワーカーキューを使用すると、これは簡単です---各ポイントサーバーが同じdbを指すようにするだけです)。
15
U Avalos

あなたはCPUにバインドされたタスクと長期実行のタスクについて言及していますが、それは明らかにnode.jsのことではありません。また、数百の同時タスクについても触れています。

Gearman job server のようなものを見るかもしれません-それは専用のソリューションです。

または、Node.jsでリクエストを管理して、実際のジョブ実行を行わないようにすることもできます。

最適なパフォーマンスを下回ることが比較的許容範囲であり、コードをJavaScriptに保持したい場合でも、それを実行できますが、何らかのジョブキューが必要です-RedisやRabbitMQなどが思い浮かびます。

実行時間に関係なく、ジョブキューは長時間実行される数百/秒のタスクにとって必須の要件になると思います。他のサーバー/サービス/マシンでこのジョブを生成できる場合を除いて、気にしないでください。Node.jsAPIは、ジョブクラスターのフロントレイヤーおよび管理レイヤーにすぎず、Node.jsはジョブに完全に対応しています。そして、あなたはそのジョブクラスターに集中する必要があり、それからあなたはより良い質問をすることができます。

さて、node.jsは、ここでも役立ちます。何百ものタスクを、それらがどこから来たかに応じて管理および保持するのに役立ちます(つまり、特定のユーザーに対してのみジョブサーバーへのリクエストの通過を許可するか、「一時停止」を制限します。 "他の人への機能など。

4
Zlatko