zlib замораживает цикл событий узла - PullRequest
0 голосов
/ 26 октября 2018

Я могу столкнуться с проблемой, когда мои обещанные zlib.gunzip начнут поглощать весь процессор и привести к тому, что мои экземпляры перестанут отвечать (я проверил задержку цикла обработки событий, и иногда она была безумно высокой).Из того, что я прочитал, zlib использует рабочие потоки, поэтому я никогда не думал, что это проблема.Код выглядит так:

const util = require('util');
const zlib = require('zlib');

const gunzip = util.promisify(zlib.gunzip);

const fetchData = async (url) => {
  const response = await request({
    url,
    encoding: null,
    resolveWithFullResponse: true
  });

  // External service is sometimes returning 200 with HTML when rate limiting
  if (response.headers['content-type'] === 'text/html; charset=UTF-8') {
    response.statusCode = 500;
    throw new ServiceError('External service error');
  }

  return gunzip(response.body);
};

Внешний провайдер допускает отправку gzip и текстовых (UTF-8) ответов.Как только я переключился на текстовую версию, загрузка процессора возросла со 100% до 10% в производстве (возможно с 3-4 QPS).Дело в том, что большую часть времени мне приходится выбрасывать ServiceError, потому что меня ограничивают по скорости, и в этом случае путь к коду zlib не выполняется, но процессор все еще задыхается.

Есть идеи, почему это так?Я забыл что-то, что могло бы вызвать синхронизацию вызовов или заблокировать цикл обработки событий?

РЕДАКТИРОВАТЬ 1: Я понял, что проблема возникает только тогда, когда что-то добавляет в метод.В противном случае он работает как положено.

...