2017-03-24 4 views
0

ノードサーバーを使用していて、1から1ミリオン(つまり、非常に巨大なCPU操作)のシリーズを生成するAPIがあるとします。この場合、サーバーに到着する他の要求はキューに入れられます彼らのターンは、これはユーザエクスペリエンスを失う)ノードがシングルスレッドであるためです。現在のリクエストに膨大な計算量がある場合、node.jsサーバーはどのように次のリクエストを処理しますか?

node.jsで他のリクエストを待つことができないため、他の解決策がありますか?

答えて

3

現在のリクエストに膨大な計算量がある場合、node.jsサーバーはどのように次のリクエストを処理しますか?

- 計算がメインスレッドで行われ、小さな部分に分割されていない場合。

CPU集中型のタスクの実行中に他の要求にサービスを提供する機会を持っているために、あなたがいずれかを行う必要があります。

  1. の部分にブレークアップあなたの計算をして
  2. 使用し、それらを実行するためにsetImmediateまたはprocess.nextTickを使用そのタスクの外部プロセスであり、HTTP、TCP、IPCまたは子プロセスの産出を使用する他の外部プログラムまたはサービスと同様に呼び出すか、キューシステム、pub/subなどを使用して呼び出す。
  3. C++でネイティブアドオンを作成し、そのスレッドを使用する

重要なことは、あなたのV8スレッドで頻繁にを展開してスタックする必要があるため、イベントループが可能な限り頻繁にイベントを処理する可能性があることです。また、10秒かかる長い計算時間を1000個の小さな部分に分割すると、サーバーは毎回10ミリ秒間新しい要求やその他のI/Oやイベントを1000回処理することができなくなります。

CPU負荷の高い操作をしている場合は、イベントループをブロックするだけでなく、そのような場合にすべてを利用する必要があるため、要求を処理するプロセスからそれらを移動することを強くお勧めしますあなたのCPUのコアと同じくらい多くのプロセス(またはスレッド)をCPU(あるいはハイパースレッディング)で実行し、すべてのI/Oを持つことが最適ですCPU負荷の高い処理を単独では処理しない別のプロセスで実行されます。

0

シングルスレッドは、First Come First Serveによってプロセスがスケジュールされることを意味しません。私は真剣に、複数のリクエストがFirst Come First Serveスタイルで処理されるとは思わないので、これは大きな問題ではありません。全体的なシステムは、処理に時間がかかりすぎる要求のために遅くなります。あなたが複数の要求を持っているので、もしこれがあるん何

https://nodejs.org/api/cluster.html

が、あなたは基本的に、すべて同じポートで実行されている、あなたのアプリケーションの複数のインスタンスを起動することができます

そして、そのための

は、ノードは解決策を持っていますそのうちのごく一部が時間がかかりすぎると、クラスタ内の他の子プロセスが後続の要求に応答できます。

+1

FCFSとは何ですか?この用語は質問では使用されておらず、その意味はあなたの答えから明らかではありません。私の無知を許しなさい。 –

+0

fcfs =先に来てください。それが無知や何か悪いことを意味するのではないことを知らずに、私は「先着順」がfcfsにあまりにも一般的に省略されているとは思わない。大学の教授がそれをしました、それが私がしている理由です。混乱させて申し訳ありません。 – ardilgulez

関連する問題