2013-05-09 53 views
10

所以,我试图优化我的节点应用程序,并且我的应用程序发出HTTP和HTTPS请求。Nodejs最大套接字池设置

从这篇文章从LinkedIn制作节点之快,建议禁用套接字池,除去5个插座的极限:

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

现在从GitHub上Mikeal(请求的开发者),他建议:

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

公平地说,他并不是建议无穷大,但是你可以在那里提出任何合理的价值。现在

,我的应用程序使用HTTP和HTTPS,所以我用这个代码:

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

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

TypeError: Cannot set property 'maxSockets' of undefined

最后,在查看HTTP记录它不显示“globalAgent”,而只显示agent.maxSockets

所以,我想知道第一,重写此参数的最佳语法是什么?

二,什么是最优值?它是基于我的服务器的内存量吗?它的带宽?

+2

当我升级到Node.js v0.10.24时,我不再看到以下错误:TypeError:无法设置未定义的属性'maxSockets' – 2014-03-17 18:01:21

+1

请注意,Node 0.12将默认的'maxSockets'值更改为'Infinity':http://stackoverflow.com/a/12061013/504930 – devius 2015-10-06 14:59:25

回答

14

关于TypeError的问题,我在设置http.globalAgent.maxSocketshttps.globalAgent.maxSockets时没有遇到任何错误。您的应用中还有其他内容正在发生。

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

var http = require('http'); 
var myAgent = new http.Agent(); 

http.request({ ... , agent: myAgent }, ...); 

请使用自定义代理与全球代理根本不作出互动。如果您没有明确指定一个或全部使用代理(通过在请求选项中传递false作为agent值),则全局代理只是默认的代理。

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

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

+0

因此,我检查了一倍。它在我的本地机器(节点v0.10.3和v0.8.7)上正常工作,但它在我的Joyent SmartOS机器上崩溃(也运行节点v0.8。7)的消息“TypeError:不能设置未定义的属性'maxSockets'”为什么它会不同? – 2013-05-10 18:38:37

+0

它可能是Joyent PaaS的体系结构限制。解决他们的支持。 – matanster 2013-12-18 21:48:37

+0

您是否检查过maxSockets是否适用于https? – 2016-09-13 16:09:49