11

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

所以,我首先想知道,覆盖这个参数的最佳语法是什么?

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

4

1 回答 1

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 的并发连接数,并且您要确保不会因大量并发请求而使服务器不堪重负。(一次发出足够多的请求,你实际上是在对服务器进行 DOS 操作。)

于 2013-05-09T23:15:53.993 回答