繁体   English   中英

NodeJs:在maxsockets限制为10的情况下,如何限制globalAgent中的请求队列

[英]NodeJs: In Case when maxsockets are limited to 10, how to limit request queue in globalAgent

有一个节点服务器托管,从应用程序我们也通过http向一些外部api发出请求。 此外部服务可以处理10request / sec。 应用程序支持Nginx,超时30秒。 现在假设我们在nodejs app服务器上加载10k请求。 因为我们确实依赖于外部api,它可以在30秒内处理最大10 * 30请求。 只有300个请求将被提供,其余的将由Nginx终止。 但是这个10k的请求仍然排队进入https.globalAgent.requests队列并继续运行。 无法指定sockettimeout或限制请求队列的大小。 对应用程序的进一步调用最终将排队等待外部服务,之后将由Nginx终止。

所以问题是:我们有什么办法可以设置socketTimeOut吗? 有什么办法可以限制队列的大小吗? 任何解决方法?

示例代码

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);

我建议你使用像https://github.com/jhurliman/node-rate-limiter这样的速率限制库

如果超出限制,您可以立即回复请求,并提供429错误代码( https://httpstatuses.com/429 )或错误消息,或者您可以等到有可用的请求插槽

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM