Сокет Node.js зависает с http.get, но не с модулем запроса - PullRequest
0 голосов
/ 01 октября 2018

Я выполняю несколько http-вызовов в лямбда-сервисе AWS.Количество звонков ~ 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.Когда вызывается лямбда, он выполняет ~ 40 запросов за одно выполнение.Моя проблема в том, что в начале все выглядит хорошо и все запросы выполняются правильно.Через некоторое время (это может быть через ~ 30 мин) звонки начинают ухудшаться, и я получаю сообщение об ошибке «Ошибка повешения сокета».

Затем я попытался использовать модуль запроса и изменил код следующим

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);
  }
});

В этом случае, при одинаковом количестве запросов в одной и той же лямбде, одна и та же настройка I never получает ошибку ECONNRESET.Я в порядке, используя модуль запроса, но мне любопытно узнать, почему это происходит с реализацией http по умолчанию.Это вызвано распределением сокетов, которое модуль request обрабатывает более подходящим способом?

Я знаю, что подобные вопросы уже задавались, но я не нашел хорошего ответа для своего случая.

1 Ответ

0 голосов
/ 01 октября 2018

Это не совсем ответ, но я не могу писать комментарии.

Основное различие, которое я вижу, - это кодировка.Кодировка по умолчанию в запросе utf8, тогда как в модуле http это buffer.Добавление res.setEncoding('utf8'); может быть полезным.Это не может быть быстрее.В строке body += chunk вы просто неявно преобразуете Buffer в строку, поэтому он должен быть таким же.

Если добавление setEncoding ничего не изменит, вы можете сообщить о проблеме в nodejs.команда, потому что это то же самое, что и пример в http_http_get_url_options_callback .Они должны это исправить или изменить пример.

...