zlib冻结节点事件循环

时间:2018-10-26 19:18:13

标签: javascript node.js zlib event-loop

我可以解决一个问题,即我承诺的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:我意识到问题仅在方法中抛出某些异常时才会发生。否则它将按预期工作。

0 个答案:

没有答案