ホームページ > 記事 > ウェブフロントエンド > Nodejsの同時複数リクエスト502
最近、nodejs を使用しているときに問題が発生しました。複数の同時リクエストを送信すると、502 エラーが返されます。私はこの問題を調査するのに時間を費やし、最終的に解決策を見つけました。この記事では、同じ問題を抱えている他の人を助けることを願って、私の経験を共有します。
まず、502 エラーとは何かを理解する必要があります。 502 エラーは、通常、リクエスト中にエラーまたはタイムアウトが発生したために、サーバーがクライアントからのリクエストを正しく処理できないことを意味します。 Nodejs では、このエラーは通常、リクエストがブロックされているか、リクエストのタイムアウトが正しく設定されていないことが原因で発生します。
次に、nodejs で複数の同時リクエストを送信する方法を見てみましょう。 nodejs では、async.Parallel を使用して複数の同時リクエストを送信できます。サンプル コードは次のとおりです。
const async = require('async'); const request = require('request'); const urls = [ 'https://www.example.com/page1', 'https://www.example.com/page2', 'https://www.example.com/page3', // Add more URLs here. ]; async.parallel( urls.map(url => callback => request(url, (err, res, body) => callback(err, body))), (err, results) => { if (err) { console.error(err); return; } console.log(results); }, );
上記のコードでは、async.Parallel を使用して複数のリクエストを並行して送信します。リクエストする URL を配列に入れ、map 関数を使用してそれらをリクエストのセットに変換します。次に、async.Parallel を使用してこれらのリクエストを並行して送信し、リクエストが完了したときに結果を収集します。
次に、502 エラーを解決する方法を見てみましょう。私の調査によると、502 エラーは通常、ブロックされたリクエスト、またはリクエストのタイムアウトが誤って設定されていることが原因で発生することがわかりました。リクエストがブロックされた場合は、リクエストを正しく処理するコールバック関数がないか、リクエスト中にリソースを解放しなかったことが原因である可能性があります。
1 つの方法は、リクエスト ライブラリによって提供されるキープアライブ オプションを使用することです。キープアライブ オプションを使用すると、リクエストを接続プールに保持し、既存の TCP 接続を再利用できるため、サーバーの負荷が軽減され、パフォーマンスが向上します。これをリクエスト オプションに追加できます:
const request = require('request').defaults({ forever: true });
もう 1 つの方法は、リクエストにタイムアウト オプションを追加することで、リクエストのブロックを回避することです。リクエスト オプションにタイムアウト オプションを追加できます。
const request = require('request').defaults({ timeout: 5000 });
上記のコードはタイムアウトを 5000 ミリ秒に設定します。つまり、リクエストが 5 秒を超えるとタイムアウト エラーがスローされます。
最後に、502 エラーが発生した場合は、リクエストを一度に送信するのではなく、バッチで送信してみてください。そうすることで、サーバーの負荷が軽減され、502 エラーの可能性が減少します。サンプル コードは次のとおりです。
const async = require('async'); const request = require('request').defaults({ timeout: 5000 }); const urls = [ 'https://www.example.com/page1', 'https://www.example.com/page2', 'https://www.example.com/page3', // Add more URLs here. ]; const chunkSize = 2; // Set the maximum number of requests to send at once. async.eachLimit( urls, chunkSize, (url, callback) => request(url, (err, res, body) => callback(err, body)), (err) => { if (err) { console.error(err); return; } console.log('All requests completed successfully.'); }, );
上記のコードでは、リクエストを 2 つのグループに分割し、async.eachLimit を使用して一度に送信されるリクエストの最大数を制限します。そうすることで、サーバーの負荷が軽減され、502 エラーの可能性が減少します。
つまり、nodejs 同時リクエスト 502 エラーの問題が発生した場合は、上記の方法を使用して解決してみてください。リクエストのコールバック関数やタイムアウトの設定に注意することで、リクエストがブロックされる可能性を減らすことができます。さらに、リクエストをバッチで送信すると、過負荷の状況を回避し、502 エラーの可能性を減らすことができます。
以上がNodejsの同時複数リクエスト502の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。