一尘不染

Node.js最大套接字池设置

node.js

因此,我正在尝试优化节点应用程序,并且我的应用程序发出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

因此,我首先想知道,重写此参数的最佳语法是什么?

第二,最优值是多少?它基于服务器的内存量吗?它的带宽?


阅读 319

收藏
2020-07-07

共1个答案

一尘不染

至于TypeError您得到的,设置http.globalAgent.maxSockets或时我没有任何错误https.globalAgent.maxSockets。您的应用中还有其他情况。

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

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

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

使用自定义代理程序发出的请求根本不会与全局代理程序进行交互。如果您没有显式指定一个代理或选择不一起使用代理(通过在request选项中false作为agent值传递),则全局代理只是使用的默认代理。

因此,当文档说时agent.maxSockets,他们实际上是在指通用Agent类。每个实例都具有该属性,包括全局代理(默认代理),您 必须
通过该属性进行访问http.globalAgent

问题的第二部分(最佳maxSockets)很难回答。请记住,许多服务器将限制来自给定IP的并发连接的数量,并且您要确保不会让大量并发请求的服务器不堪重负。(随着一次触发足够多的请求,您实质上是在DOS服务器。)

2020-07-07