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操作。)