所以,我正在尝试优化我的节点应用程序,我的应用程序发出HTTP和HTTPS请求。
来自LinkedIn的这篇文章,为了使节点快速,它建议禁用套接字池来删除5个套接字的限制:
// Disable socket pooling
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)
现在来自GitHub的Mikeal(Request的开发者),他建议:
require('http').globalAgent.maxSockets = Infinity
公平地说,他并不暗示无限,但你可以在那里放任何合理的价值。
现在,我的应用使用了http和https,所以我使用了这段代码:
var http = require('http');
http.globalAgent.maxSockets = 30;
var https = require('https');
https.globalAgent.maxSockets = 30;
当我这样做时,我收到此错误:
TypeError:无法设置未定义
的属性'maxSockets'
最后,在查看HTTP文档时,它没有显示“globalAgent”,而只显示agent.maxSockets。
所以,我首先想知道,覆盖此参数的最佳语法是什么?
其次,什么是最佳值?它是基于我的服务器有多少内存?它的带宽?
答案 0 :(得分:14)
关于您获得的TypeError
,在设置http.globalAgent.maxSockets
或https.globalAgent.maxSockets
时,我不会收到任何错误。你的应用程序还有其他功能。
关于问题的第一部分,请注意您不仅限于使用全局代理。您可以创建自己的Agent
实例并使用它来发出请求:
var http = require('http');
var myAgent = new http.Agent();
http.request({ ... , agent: myAgent }, ...);
使用自定义代理发出的请求根本不与全局代理进行交互。如果您没有明确指定一个或选择不使用代理(通过在请求选项中传递false
作为agent
值),则全局代理只是默认使用的代理。
因此,当文档说agent.maxSockets
时,它们实际上指的是通用Agent
类;每个实例都具有该属性,包括您必须通过http.globalAgent
访问的全局(默认)代理。
问题的第二部分(最佳maxSockets
)是一个难以回答的问题。请记住,许多服务器将限制来自给定IP的并发连接数,并且您希望确保不会使具有大量并发请求的服务器瘫痪。 (如果有足够的请求立刻被启动,那么你就是在服务器上。)