2017-03-24 6 views
1

ノードサーバーがホストされており、アプリケーションからhttp経由で外部apiにリクエストを送信します。この外部サービスは10request/secを処理できます。アプリケーションはNginxの後ろにあり、タイムアウトは30秒です。ここでnodejsアプリケーションサーバーに10kリクエストの負荷をかけてみましょう。我々は30秒以内に最大10 * 30要求を処理できる外部APIに依存しているので。 300リクエストのみがサービスされ、残りはNginxによって終了されます。しかし、まだこの10kのリクエストは、https.globalAgent.requestsのキューに入れられ、実行され続けます。 sockettimeoutを指定する方法や、要求キューのサイズを制限する方法はありません。アプリケーションへのさらなる呼び出しは、最終的に外部サービスのためにキューに入れられ、後でNginxによって終了されます。NodeJs:maxsocketsが10に制限されている場合、globalAgentのリクエストキューを制限する方法

質問があります: socketTimeOutを設定する方法はありますか? キューのサイズを制限する方法はありますか。 回避策はありますか?私はあなたがexcededリミットの場合https://github.com/jhurliman/node-rate-limiter

のようなレート制限のライブラリを使用することをお勧めします

var http = require('http'); 
var https = require('https'); 
var Q = require('q'); 
var file = require('fs'); 
var request = require('request'); 
http.globalAgent.maxSockets = 10; 
https.globalAgent.maxSockets = 10; 
https.globalAgent.keepAlive=true; 


http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 

    var st = new Date(); 
    var rr = request(
     {url:'https://amazon.com',timeout:100000,time:true}, 
     function(err,resp,body){ 
      var et = new Date(); 
      // console.log(resp && resp.timings.socket,st-et,err); 
      console.log(https.globalAgent) 
      res.end('ok'); 
     } 
    ); 


}).listen(9898); 

答えて

0

サンプルコードは、あなたが429エラーコードで、要求に即座に答えることができる

https://httpstatuses.com/429)またはKOエラーメッセージ 、または利用可能なリクエストスロットがあるまで待つことができます

関連する問題