Node.js + Express 2 でプロキシを作成しています。プロキシは次のようにする必要があります。
- POST ペイロードを復号化し、結果に基づいてサーバーに HTTP 要求を発行します。
- サーバーからの返信を暗号化し、クライアントに送り返します。
暗号化関連の部分は正常に動作します。私が直面している問題はタイムアウトです。プロキシは 15 秒未満でリクエストを処理する必要があります。実際、それらのほとんどは 500 ミリ秒未満です。
並列リクエストの数を増やすと問題が発生します。ほとんどのリクエストは正常に完了しますが、一部は 15 秒 + 数ミリ秒後に失敗します。ab -n5000 -c300
正常に動作しますが、同時実行数が 500 の場合、タイムアウトのある一部のリクエストで失敗します。
私は推測することしかできませんでしたが、問題はコールバックの実行順序にあるようです。ETIMEDOUT
500ms未満の時間内にまだ処理されている最新のものにノードが焦点を合わせているため、最初に来るリクエストがハングする可能性はありますか?
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
。ただし、ルート ハンドラは複数回呼び出されます。
そのような行動の理由を見つけることができません。何かアドバイスはありますか?