gpt4 book ai didi

javascript - 增加从 node.js 到外部系统的并行请求需要更多时间来响应

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:14 27 4
gpt4 key购买 nike

我有一个简单的案例,我从我的 node.js 服务器请求不同的上游代理服务器。随着负载的增加,我看到请求需要花费大量时间来执行(尽管从我的上游代理服务器响应所花费的时间在请求中是恒定的)。为了演示这个问题,我编写了一个示例程序,如下所示。当我执行下面的程序时,第一个请求需要 118ms 来执行,最后一个请求需要 10970ms ,具体取决于您访问的网站(我已经将 url 更改为 google,在您最喜欢的网站上尝试一下)。如果您观察到我正在使用异步来并行化我的请求。

问题是,node.js 在并行运行时花费这么多时间来执行请求的原因是什么。为了提供更多关于基础设施设置(centos 6.5)的上下文,我打开了从 1024 到 65535 的端口范围,将 fin_timeout 更改为 15 秒并为 sysctl.conf 中的套接字启用 tw_reuse =1

var http = require('http');
var uuid = require('node-uuid');
var async = require('async');

function callExternalUrl(){
var uniqueId = uuid.v4();
console.time(uniqueId);
var options = {
host: 'google.com',
port: '80',
path: '/',
method: 'GET'
};
var req = http.request(options, function(res) {
var msg = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
msg += chunk;
console.timeEnd(uniqueId);
});
res.on('end', function() {
});
});
req.end();
}

function iterateAsync(callback){
var iter = [];
for(var i=0; i<1000; i++){
iter[i] = i;
}
async.each(iter,
function(item, callback) {
callExternalUrl();
},
function(err) {
callback(err);
}
);
}

iterateAsync(function(){console.log('done');});

为了提供更多上下文,下面是 ruby​​ 中执行相同操作的代码。我知道我无法将这两种语言进行比较,就像苹果对苹果一样。但想法是显示使用 ruby​​ 依次执行相同请求所花费的时间。我没有看到按顺序发出的每个请求的响应时间有任何增加。所以,我怀疑使用 Node 的并行请求是否需要更多时间来响应请求(问题不是来自服务器响应,而是来自机器本身发出的请求)

require 'rest_client'

1000.times do |number|
beginning = Time.now
response = RestClient.get 'http://google.com'
puts "Time elapsed #{Time.now - beginning} seconds"
end

最佳答案

首先,您没有调用异步迭代器回调函数:

function callExternalUrl(asyncCallback) {
...
res.on('end', function() {
asyncCallback();
});
...
}

function iterateAsync(callback) {
var iter = [];
for(var i=0; i<1000; i++){
iter[i] = i;
}
async.each(iter,
function(item, asyncCallback) { // <-- HERE
callExternalUrl(asyncCallback);
},
function(err) {
callback(err);
}
);
}

此外,根据您使用的 Node 版本,http 模块可能会限制对特定主机名发出的并行请求的数量:

$ node -pe 'require("http").globalAgent.maxSockets'

在 Node 0.10 上,默认为 5;在 Node 0.12 上,默认值为 Infinity(“无限制”)。因此,如果您不在 Node 0.12 上,则应在代码中增加该值:

var http = require('http');
http.globalAgent.maxSockets = Infinity;
...

关于javascript - 增加从 node.js 到外部系统的并行请求需要更多时间来响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com