我可以解决一个问题,即我承诺的zlib.gunzip
将开始耗尽所有CPU并导致我的实例变得无响应(我检查了事件循环滞后,有时它会非常高)。据我了解,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);
};
外部提供程序允许压缩和文本(UTF-8)响应。切换到文本版本后,生产中的CPU使用率从100%变为10%(可能是3-4 QPS)。问题是,大多数时候我不得不抛出ServiceError
,因为我受到速率的限制,并且在这种情况下不会执行zlib代码路径,但是CPU仍然很阻塞。
有人知道为什么会这样吗?我是否忘记了可能导致呼叫同步或阻止事件循环的事情?
编辑1:我意识到问题仅在方法中抛出某些异常时才会发生。否则它将按预期工作。