因此,我正在尝试优化节点应用程序,并且我的应用程序发出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。
因此,我首先想知道,重写此参数的最佳语法是什么?
第二,最优值是多少?它基于服务器的内存量吗?它的带宽?
至于TypeError您得到的,设置http.globalAgent.maxSockets或时我没有任何错误https.globalAgent.maxSockets。您的应用中还有其他情况。
TypeError
http.globalAgent.maxSockets
https.globalAgent.maxSockets
关于问题的第一部分,请意识到您不仅限于使用全局代理。您可以创建自己的Agent实例,并使用该实例发出请求:
Agent
var http = require('http'); var myAgent = new http.Agent(); http.request({ ... , agent: myAgent }, ...);
使用自定义代理程序发出的请求根本不会与全局代理程序进行交互。如果您没有显式指定一个代理或选择不一起使用代理(通过在request选项中false作为agent值传递),则全局代理只是使用的默认代理。
false
agent
因此,当文档说时agent.maxSockets,他们实际上是在指通用Agent类。每个实例都具有该属性,包括全局代理(默认代理),您 必须 通过该属性进行访问http.globalAgent。
agent.maxSockets
http.globalAgent
问题的第二部分(最佳maxSockets)很难回答。请记住,许多服务器将限制来自给定IP的并发连接的数量,并且您要确保不会让大量并发请求的服务器不堪重负。(随着一次触发足够多的请求,您实质上是在DOS服务器。)
maxSockets