73

REST API をプロキシとして実装する node.js サーバーがあります。これは、わずかに異なる、残念ながら非対称の REST API を持つ中央サーバーです。

さまざまなブラウザーで実行されるクライアントは、ノード サーバーに中央サーバーからタスクを取得するように要求します。ノード サーバーは、中央のタスク ID からすべてのタスク ID のリストを取得し、それらをクライアントに返します。次にクライアントは、プロキシを介して ID ごとに 2 つの REST API 呼び出しを行います。

私が知る限り、これはすべて非同期で行われます。クライアントを起動すると、コンソール ログには次のように表示されます。

Requested GET URL under /api/v1/tasks/*: /api/v1/tasks/

これには、中央サーバーからリストを取得するのに数秒かかります。応答を受け取るとすぐに、サーバーはこれを非常に迅速に遮断します。

Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/438
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/438
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/439
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/439
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/441
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/441

次に、これらの要求のペアが中央サーバーから結果を取得するたびに、別の 2 つの行が非常に迅速に遮断されます。

したがって、node.js サーバーは一度に 6 つのリクエストしか処理できないようです。

4

6 に答える 6

164

ノード自体によって課されるTCP接続の制限はありません。(要点は、それが非常に同時であり、何千もの同時接続を処理できるということです。)お使いのOSはTCP接続を制限するかもしれません。

バックエンドサーバーのある種の制限に達しているか、組み込みのHTTPライブラリの接続制限に達している可能性が高いですが、そのサーバーまたはノードの実装に関する詳細がなければ、言うのは難しいです。

ノードの組み込みHTTPライブラリ(および明らかにその上に構築されたライブラリのほとんど)は、AgentHTTPキープアライブを利用できるように(クラスを介して)接続プールを維持します。これにより、同じサーバーに対して多数のリクエストを実行する場合のパフォーマンスが向上します。TCP接続を開き、HTTPリクエストを作成し、応答を取得し、TCP接続を閉じて、繰り返すのではなく、再利用されたTCP接続で新しい要求を発行できます。

ノード0.10以前では、HTTPエージェントはデフォルトで単一のホストへの5つの同時接続のみを開きます。これは簡単に変更できます:( requireHTTPモジュールをとしてdしたと仮定してhttp

http.globalAgent.maxSockets = 20; // or whatever

ノード0.12は、デフォルトmaxSocketsをに設定しますInfinity

ある種の接続制限を設定しておくことをお勧めします。1秒間に数百のHTTPリクエストでバックエンドサーバーを完全に圧倒したくはありません。サーバーに過負荷をかけないようにリクエストを調整して、エージェントの接続プールに処理を任せる場合よりもパフォーマンスが低下する可能性があります。最善の策は、いくつかの実験を実行して、状況に応じた同時リクエストの最適な数を確認することです。

ただし、接続プールが本当に必要ない場合は、プールを完全にバイパスすることができます–リクエストオプションで送信agentされます。false

http.get({host:'localhost', port:80, path:'/', agent:false}, callback);

この場合、同時HTTPリクエストにまったく制限はありません。

于 2012-08-21T18:37:50.613 に答える
16

これは、ブラウザでの同時接続数の制限です。

一般的なブラウザで許容される同時 AJAX (XmlHttpRequest) リクエストの数は?

問題の診断に役立ったので、他の回答に賛成しました。手がかりは、ノードのソケット制限が 5 で、一度に 6 つ取得していたことです。サーバーをテストするために使用していたChromeの制限は6です。

于 2012-08-21T19:24:19.073 に答える
8

中央サーバーからどのようにデータを取得していますか? httpモジュールで HTTP リクエストを行う場合、「ノードは接続を制限しません」は完全に正確ではありません。この方法で作成されたクライアント要求は のhttp.globalAgentインスタンスを使用しhttp.Agent、それぞれhttp.Agentに と呼ばれる設定がmaxSocketsあり、エージェントが特定のホストに対して開くことができるソケットの数を決定します。デフォルトは 5 です。

そのため、http.requestまたはhttp.get(またはこれらのメソッドに依存するライブラリ) を使用して中央サーバーからデータを取得している場合は、値を変更してみてくださいhttp.globalAgent.maxSockets(または、使用しているインスタンスの設定を変更してhttp.Agentください)。

見る:

于 2012-08-21T20:53:13.553 に答える
2

サーバーで同じ問題が発生しました。4つのリクエストしか処理していませんでした。0.12 から既に説明したように、maxsockets のデフォルトは無限大です。それはサーバーを簡単に圧倒します。10 と言う要求を制限する

http.globalAgent.maxSockets = 20;

私の問題を解決しました。

于 2017-04-05T03:59:56.497 に答える
1

結果をクライアントに返すだけですか?ノードはすべてを 1 つのスレッドで処理します。したがって、派手な応答解析やその他の結果が得られないことを行うと、すべての要求がブロックされます。

于 2012-08-21T18:51:14.113 に答える