可扩展性,使用的木偶使Node.js应用密集的PDF生成任务?
该应用程序的目标是产生一个使用PDF格式的木偶,我们获取数据,建立HTML模板然后用铬无头生成PDF,我们接着,返回一个链接到新生成的PDF文件。
这个问题,是需要花费大约7000毫秒生成PDF,主要是因为三个操纵木偶的功能:启动(启动无头broweser),跳转(导航到HTML模板)和PDF(生成PDF)。
所以具有约7〜8秒回答一个请求,与更多的传入请求或突然激增,它可以很容易地需要大约40到50秒30个同时请求,这是我发现是不可接受的。
经过大量的时间花费在研究上,我会实现群集模块采取多个进程的优势。
但是,除了集群外,还有什么其他可行的方案,以优化的单一实例的时间?
回答如下:有什么考虑?
- 考虑到每个应用程序开始调用一次
puppeteer.launch
。您的转换脚本将只检查是浏览器实例已经存在,并通过调用newPage()
,基本上新建选项卡使用它,而不是创建浏览器每次。 - 您可以考虑调用时进行拦截
Request
为page.on('request', this.onPageRequest);
goto()
和过滤掉某些类型的页面加载,现在的文件,但你并不需要他们的PDF渲染;你可以滤除外部资源,以及如果您遇到这种情况。 - 当使用
pdf()
您可以从您的服务回报回Buffer
,而不是使用文件系统,并返回链接PDF文件的创建位置。这可能会或可能不会加快东西,取决于你的服务设置;反正少IO应该会更好。
这可能是你能为你的应用程序的单一实例做;根据以上规则的执行(几页),PDF与一些图像1-2秒使我。
为了加快东西使用群集。除了将它嵌入到你的应用程序中,你可以考虑使用PM2管理器启动和服务的规模多个实例。