Nodejs最大套接字池设置

所以,我试图优化我的节点应用程序,我的应用程序发出HTTP和HTTPS请求。

从LinkedIn的这篇文章快速制作节点,build议禁用套接字池以消除5个套接字的限制:

// Disable socket pooling var http = require('http'); var options = {.....}; options.agent = false; var req = http.request(options) 

现在来自GitHub的Mikeal(Request的开发者),他build议:

 require('http').globalAgent.maxSockets = Infinity 

公平地说,他并不是build议无限,但是你可以在那里设置合理的价值。

现在,我的应用程序使用http和https,所以我用这个代码:

 var http = require('http'); http.globalAgent.maxSockets = 30; var https = require('https'); https.globalAgent.maxSockets = 30; 

当我这样做,我得到这个错误:

TypeError:无法设置未定义的属性'maxSockets'

最后,在查看HTTP文档时,它没有显示“globalAgent”,而是只显示了agent.maxSockets 。

所以,我想知道第一,什么是覆盖这个参数最好的语法?

其次,什么是最优价值? 它是基于我的服务器有多less内存? 它的带宽?

关于你得到的TypeError ,当设置http.globalAgent.maxSockets或者https.globalAgent.maxSockets时候,我不会有任何的错误。 在你的应用中还有其他事情正在发生。

关于你的问题的第一部分,要意识到你不仅限于使用全球代理。 您可以创build您自己的Agent实例并使用它来发出请求:

 var http = require('http'); var myAgent = new http.Agent(); http.request({ ... , agent: myAgent }, ...); 

使用自定义代理进行的请求根本不与全局代理进行交互。 全局代理只是默认的代理,如果您没有明确指定一个代理或一起使用代理(通过在请求选项中传递false作为agent值),那么它将被使用。

所以当文档说agent.maxSockets ,他们实际上是指通用的Agent类; 每个实例都有该属性,包括全局(默认)代理 – 您必须通过http.globalAgent访问该代理。

你的问题的第二部分(最佳的maxSockets )是一个难以回答的问题。 请记住,许多服务器将限制来自给定IP的并发连接数量,并且要确保不会让大量并发请求压倒一个服务器。 (如果有足够的请求立即启动,那么您实际上是在对服务器进行DOS操作。)