5

Node.js + Express 2 でプロキシを作成しています。プロキシは次のようにする必要があります。

  1. POST ペイロードを復号化し、結果に基づいてサーバーに HTTP 要求を発行します。
  2. サーバーからの返信を暗号化し、クライアントに送り返します。

暗号化関連の部分は正常に動作します。私が直面している問題はタイムアウトです。プロキシは 15 秒未満でリクエストを処理する必要があります。実際、それらのほとんどは 500 ミリ秒未満です。

並列リクエストの数を増やすと問題が発生します。ほとんどのリクエストは正常に完了しますが、一部は 15 秒 + 数ミリ秒後に失敗します。ab -n5000 -c300正常に動作しますが、同時実行数が 500 の場合、タイムアウトのある一部のリクエストで失敗します。

私は推測することしかできませんでしたが、問題はコールバックの実行順序にある​​ようです。ETIMEDOUT500ms未満の時間内にまだ処理されている最新のものにノードが焦点を合わせているため、最初に来るリクエストがハングする可能性はありますか?

PS: リモート サーバーに問題はありません。私はそれとのやり取りにリクエストを使用しています。

更新

いくつかのコードで物事が機能する方法:

function queryRemote(req, res) {
  var options = {};  // built based on req object (URI, body, authorization, etc.)
  request(options, function(err, httpResponse, body) {
    return err ? send500(req, res)
               : res.end(encrypt(body));
  });
}

app.use(myBodyParser);  // reads hex string in payload
                        // and calls next() on 'end' event

app.post('/', [checkHeaders,   // check Content-Type and Authorization headers
               authUser,       // query DB and call next()
               parseRequest],  // decrypt payload, parse JSON, call next()
         function(req, res) {
  req.socket.setTimeout(TIMEOUT);
  queryRemote(req, res);
});

私の問題は次のとおりです。abたとえば、 に 20 個の POST を発行すると/、高速ルート ハンドラが何千回も呼び出されます。これは常に発生しているわけではありません。20 個のリクエストがタイムリーに処理されることもあります。

もちろんab問題ありません。から送信されたリクエストは 20 件だけであると 100% 確信していますab。ただし、ルート ハンドラは複数回呼び出されます。

そのような行動の理由を見つけることができません。何かアドバイスはありますか?

4

2 に答える 2

2

http.globalAgentタイムアウトは、デフォルトで最大5つの同時リクエストを1つに処理できる使用によって引き起こされましたhost:port(私の場合は十分ではありません)。

(数十ではなく)数千のリクエストが送信されましたab(WiresharkはOS Xで事実を承認しました。Parallels内のUbuntuではこれを再現できません)。

于 2012-12-05T15:15:44.707 に答える
1

node-http-proxyモジュールと、それが接続を処理する方法を確認できます。データをバッファリングせず、すべてがストリーミングによって機能することを確認してください。そして、これらの長いリクエストに費やされた時間がどこにあるかを確認するようにしてください。conosle.timeコードの一部をandで計測してみconsole.timeEndて、最も時間がかかっている場所を確認してください。ほとんどの時間が JavaScript に費やされている場合は、プロファイルを作成してみてください。基本的に、node コマンドに --prof オプションを追加することで、v8 プロファイラーを使用できます。v8.logを作成し、 node-source-dir/deps/v8/tools にある v8 ツールを介して処理できます。scons (scons d8)経由で d8 シェルをインストールした場合にのみ機能します。こちらの記事でご覧いただけますこれを機能させるためにさらに役立ちます。

Webkit 開発者ツールを使用してプロファイラーの結果を表示するnode-webkit-agentを使用することもできます。少し砂糖を入れた私のフォークを見ることもできます.

それでもうまくいかない場合は、dtrace を使用してプロファイリングを試すことができます(SmartOS などの illumos ベースのシステムでのみ機能します)。

于 2012-11-11T03:18:37.730 に答える