考虑下面简单的Node.js应用:
var http = require('http');
http.createServer(function() { }).listen(8124); // Prevent process shutting down
var requestNo = 1;
var maxRequests = 2000;
function requestTest() {
http.request({ host: 'www.google.com', method: 'GET' }, function(res) {
console.log('Completed ' + (requestNo++));
if (requestNo <= maxRequests) {
requestTest();
}
}).end();
}
requestTest();
这使得2000的HTTP请求到google.com,一前一后。 的问题是它会请求5号并暂停约3分钟,然后继续处理请求6 - 10,然后暂停另一3分钟,然后请求11 - 15,暂停等等。 编辑: 我试图改变www.google.com到本地主机,一个非常基本的Node.js应用程序运行在我的机器,它返回的“Hello world”,我仍然得到3分钟暂停。
现在我看我可以增加连接池的限制:
http.globalAgent.maxSockets = 20;
现在,如果我运行它,它处理请求1 - 20,然后暂停3分钟,然后请求21 - 40,然后暂停,等等。
最后,一些研究之后,我才知道我可以禁用连接设置完全集中agent: false
的请求选项:
http.request({ host: 'www.google.com', method: 'GET', agent: false }, function(res) {
...snip....
......它会遍历所有2000点的要求就好运行。
我的问题,它是一个好主意,这样做呢? 有没有危险,我可以有太多的HTTP连接结束了? 为什么它会暂停3分钟,当然,如果我和它应该增加它直接放回池中准备使用的下一个请求的连接完成,那么,为什么等待3分钟? 原谅我的无知。
如果做不到这一点,什么是对的Node.js应用程序使大量潜在的HTTP请求的最佳策略,而不会抱死,或崩溃?
我在Mac OSX 10.8.2上运行Node.js的版本0.10。
编辑:我发现,如果我上面的代码转换成一个for循环,并试图在同一时间建立了一堆的连接,我开始后约242连接收到错误。 错误是:
Error was thrown: connect EMFILE
(libuv) Failed to create kqueue (24)
...和代码...
for (var i = 1; i <= 2000; i++) {
(function(requestNo) {
var request = http.request({ host: 'www.google.com', method: 'GET', agent: false }, function(res) {
console.log('Completed ' + requestNo);
});
request.on('error', function(e) {
console.log(e.name + ' was thrown: ' + e.message);
});
request.end();
})(i);
}
我不知道如果重仓的Node.js应用程序都不能达到许多并发连接。