Как исправить ошибку Socket Hangup Error, когда большое количество запросов выполняется очень быстро - PullRequest
1 голос
/ 11 апреля 2019

У меня есть приложение nodejs, которое собирает содержимое с разных веб-сайтов.Запросы делаются для асинхронной загрузки каналов из разных источников с использованием потоков запросов.Я получаю ошибку зависания сокета довольно часто, когда запросы сделаны.

err in accessing the link { Error: socket hang up
    at createHangUpError (_http_client.js:331:15)
    at TLSSocket.socketOnEnd (_http_client.js:423:23)
    at emitNone (events.js:111:20)
    at TLSSocket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9) code: 'ECONNRESET' } https://arstechnica.com/?p=1488489 

Подробности среды: версия узла - v8.12.0

Попробовал несколько предложений, приведенных в соответствующих сообщениях SO, но я все еще получаю ту же ошибку. NodeJS - Что на самом деле означает "зависание сокета"?

import request from 'request';
import FeedParser from 'feedparser';

const extractor = require('unfluff');

export const getFeedsFromSource = function (urlfeed, etag, LastModified, callback) {
  console.log(urlfeed, etag, LastModified);
  const req = request({
    method: 'GET',
    url: urlfeed,
    headers: {
      'If-None-Match': etag,
      'If-Modified-Since': LastModified,
      Connection: 'keep-alive',
      ciphers: 'DES-CBC3-SHA',
    },
  });
  const feedparser = new FeedParser();
  const metaData = {};
  const htmlData = {};
  const feedData = {};
  // const pList = null;
  req.on('response', function (response) {
    const stream = this;
    if (response.statusCode === 304) {
      console.log('Source not modified: ', urlfeed);
    }
    if (response.statusCode === 200) {
      metaData.etagin = response.headers.etag;
      metaData.LastModifiedin = response.headers['last-modified'];
      metaData.LastModifiedLocal = response.headers['last-modified'];
      stream.pipe(feedparser).end();
    }
  });
  req.on('error', (err) => {
    console.log(`getFeed: err.message == ${err.message}`);
    callback(err);
  });
  // req.end();
  feedparser.on('readable', function () {
    try {
      const item = this.read();
      if (item !== null) {
        request({
          method: 'GET',
          url: item.link,
        }, (err, info) => {
          if (!err) {
            htmlData.body = info.body;
            const parsedData = extractor(htmlData.body, 'en');
            feedData.author = [];
            feedData.videos = [];
            feedData.feedtitle = parsedData.title;
            feedData.feedmainpicture = parsedData.image;
            feedData.feedsummary = parsedData.description;
            feedData.feedmaincontent = parsedData.text;
            feedData.author.push(item.author);
            if (item.author === null) {
              feedData.author = parsedData.author;
            }
            feedData.feedurl = item.link;
            feedData.copyright = item.meta.copyright;
            // feedData.videos = parsedData.videos;
            feedData.publishedDate = item.pubdate;
            if (item.categories.length > 0) {
              feedData.categories = item.categories;
              feedData.feedtags = item.categories;
            } else if (parsedData.keywords !== undefined) {
              feedData.categories = parsedData.keywords.split(' ').join('').split(',');
              feedData.feedtags = parsedData.keywords.split(' ').join('').split(',');
            } else {
              feedData.categories = [];
              feedData.feedtags = [];
            }
            metaData.sourcename = item.meta.title;
            callback(undefined, feedData, metaData);
          } else {
            console.log('err in accessing the link', err, item.link);
          }
        });
      }
    } catch (err) {
      console.log(`getFeed: err.message == ${err.message}`);
    }
  });
  feedparser.on('error', (err) => {
    console.log(`getFeed: err.message == ${err.message}`);
  });
  feedparser.on('end', () => {
    console.log('onend');
  });
};

Пожалуйста, помогите мне с этой проблемой.

1 Ответ

1 голос
/ 11 апреля 2019

Существует множество причин зависания / сброса сокетов в производственных приложениях.Из вашего описания я считаю, что причина не в перегрузке приложения запросами (если вы не используете очень медленную машину).IMO, наиболее вероятным кандидатом является регулирование удаленным сервером из-за слишком большого количества подключений с одного и того же ip (chrome открывает до 8 подключений к любому отдельному серверу, вы должны стараться не превышать это ограничение, несмотря на то, что каждый сервер имеет разные ограничения), чтобы решить эту проблемуВы должны выполнить одно из следующих действий:

  • добавить пул запросов хоста (в основном установлен Agent.maxSockets)
  • использовать прокси-сервис (например, Luminati) для распределения запросов по многим исходным ips (большерелевантно для высоких требований к параллелизму)

Еще одна вещь, которую нужно помнить, запросы могут не выполняться по «естественным» сетевым причинам (например, из-за плохого \ нестабильного подключения к Интернету, всплесков занятости сервера), вы всегда должны делать хотя бы одинПовторите запрос, прежде чем сдаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...