Node.js套接字与http.get挂断,但未与请求模块挂断

时间:2018-10-01 07:23:34

标签: node.js aws-lambda node-modules

我正在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模块以更适当的方式处理的套接字分配引起的吗?

我知道已经问过类似的问题,但我的案子没有找到好的答案。

1 个答案:

答案 0 :(得分:0)

这不是真正的答案,但我不能写评论。

我可以看到的主要区别是编码。请求中的默认编码为utf8,而在http模块中的默认编码为buffer。添加res.setEncoding('utf8');可能会有所帮助。可能不会更快。在body += chunk行中,您只是将Buffer隐式转换为字符串,因此它应该是相同的。

如果添加setEncoding不会改变任何内容,那么您可能想向nodejs团队报告问题,因为它与http_http_get_url_options_callback中的示例相同。他们应该修复它或更改示例。