Я могу столкнуться с проблемой, когда мои обещанные 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: Я понял, что проблема возникает только тогда, когда что-то добавляет в метод.В противном случае он работает как положено.