所以,我试图优化我的节点应用程序,我的应用程序发出HTTP和HTTPS请求.
从LinkedIn的这篇文章中,为了使节点快速,建议禁用套接字池来消除5个套接字的限制:
// disable socket pooling var http = require('http'); var options = {.....}; options.agent = false; var req = http.request(options)
现在,从Mike(GateHub的请求开发人员)开始,他建议:
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.
所以,我想知道第一,覆盖这个参数的最佳语法是什么?
二,什么是最优值?是否基于我的服务器内存量?它的带宽?
解决方法
对于你所得到的TypeError,当设置http.globalAgent.maxSockets或https.globalAgent.maxSockets时,我不会收到任何错误.您的应用程式中还有其他事项.
关于您的问题的第一部分,意识到您不仅限于使用全球代理.您可以创建自己的代理实例并使用它来提出请求:
var http = require('http'); var myAgent = new http.Agent(); http.request({ ...,agent: myAgent },...);
使用自定义代理进行的请求根本不与全局代理进行交互.如果没有明确指定一个或选择不使用代理(通过将false作为请求选项中的代理值传递),则全局代理只是默认的代理.
所以当docs表示agent.maxSockets时,他们确实是指通用Agent类;每个实例都具有该属性,包括全局(默认)代理 – 您必须通过httpglobalAgent访问.
你的问题的第二部分(最佳maxSockets)是一个很难回答的问题.请记住,许多服务器将限制来自给定IP的并发连接数,并且您希望确保不会淹没具有大量并发请求的服务器. (一旦发出足够的请求,您就可以DOS服务器.)