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

PCS*_*S-I 7 architecture scalability node.js google-compute-engine puppeteer

该应用程序的目标是使用 puppeteer 生成 pdf,我们获取数据,构建 html 模板,然后使用 chrome headless 生成 pdf,然后返回新生成的 pdf 的链接。

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

因此,大约需要 7~8 秒来回答一个请求,随着更多传入请求或突然激增,很容易需要大约 40 到 50 秒来处理 30 个同时请求,这是我无法接受的。

经过大量时间的研究,我将实现集群模块以利用多个进程。

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

Sla*_*nov 7

有一些事情需要考虑...

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

这可能是您可以为应用程序的单个实例执行的所有操作;通过上述常规(几页)PDF 的实现,我可以在 1-2 秒内渲染出一些图像。

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