我正在AWS lambda中执行一些http调用。呼叫数量为每分钟约400个。 呼叫按以下代码段执行
var req = http.get("https://www.google.com", res => {
let body = '';
res.on('data', chunk => {
body += chunk;
});
res.on('end', chunk => {
if (body.includes('html')) {
console.log('Got back healthy response');
} else {
console.log('Got an unexpected response');
}
})
});
req.on('error', e => {
console.log('Got an error response');
})
这是一个简单的https请求。调用Lambda时,它一次执行约40个请求。 我的问题是,一开始,一切看起来都不错,并且所有请求都正确执行。过了一会儿(大约30分钟后),通话开始下降,我又收到“套接字挂起ECONNRESET”错误。
然后我尝试使用请求模块,并使用以下内容更改代码
const request = require('request');
request("https://www.google.com", function (error, response, body) {
if (!error && response.statusCode == 200 && body.includes('html')) {
console.log('Got back healthy response' );
} else {
console.log('Got an unexpected response');
console.log('Error: ' + error);
console.log('Response: ' + response);
console.log('Body: ' + body);
}
});
在这种情况下,对于相同的lambda中的相同数量的请求,我从不使用相同的设置会得到ECONNRESET错误。
我可以使用request模块,但是我很好奇为什么默认的http
实现会发生这种情况。
这是由request
模块以更适当的方式处理的套接字分配引起的吗?
我知道已经问过类似的问题,但我的案子没有找到好的答案。
答案 0 :(得分:0)
这不是真正的答案,但我不能写评论。
我可以看到的主要区别是编码。请求中的默认编码为utf8
,而在http模块中的默认编码为buffer
。添加res.setEncoding('utf8');
可能会有所帮助。可能不会更快。在body += chunk
行中,您只是将Buffer隐式转换为字符串,因此它应该是相同的。
如果添加setEncoding
不会改变任何内容,那么您可能想向nodejs团队报告问题,因为它与http_http_get_url_options_callback中的示例相同。他们应该修复它或更改示例。