使用 puppeteer 在 node.js 应用程序上执行密集型 pdf 生成任务的可扩展性?

Scalability for intensive pdf generation tasks on a node.js app using puppeteer?

该应用程序的目标是使用 puppeteer 生成 pdf,我们获取数据,构建 html 模板,然后使用 chrome headless 生成 pdf,然后,我们 return一个link到新生成的pdf。

问题是生成 pdf 大约需要 7000 毫秒,主要是因为三个 puppeteer 函数:launch(启动无头浏览器)、goto(导航到 html 模板)和 pdf (生成pdf)。

因此,大约需要 7 到 8 秒来回答一个请求,如果有更多传入请求或突然激增,则 30 个同时请求可能很容易需要大约 40 到 50 秒,我觉得这是不可接受的。

经过多次研究,我将实现集群模块以利用多进程。

但是除了集群之外,还有其他可能的选项来优化单个实例的时间吗?

有些事情需要考虑...

  1. 考虑在每次启动应用程序时调用 puppeteer.launch 一次。您的转换脚本将只检查浏览器实例是否已经存在并通过调用 newPage() 使用它,这基本上是创建新选项卡,而不是每次都创建浏览器。
  2. 您可以考虑在调用goto()时将Request拦截为page.on('request', this.onPageRequest);并过滤掉页面正在加载的某些类型的文件,但您不需要它们用于 PDF 渲染;如果是这种情况,您也可以过滤掉外部资源。
  3. 当使用 pdf() 时,您可以 return 从您的服务返回 Buffer,而不是使用文件系统和 return link 到 PDF 的位置文件创建。这可能会或可能不会加快速度,具体取决于您的服务设置;反正IO越少越好。

这可能是您对应用程序的单个实例所能做的全部;通过上面的实现,带有一些图像的常规(几页)PDF 在 1-2 秒内为我呈现。

要加快速度,请使用集群。除了将其嵌入您的应用程序之外,您还可以考虑使用 PM2 管理器来启动和扩展服务的多个实例。