我正在做负载测试我不希望服务器崩溃,当我启动单独的 puppeteer 实例并尝试运行两个查询时,它们每个都从 mysql db 获取 100mb 的数据,当我运行单个 puppeteer 时一切顺利,所以我研究并遇到了 puppeteer-cluster,现在基本上我需要每分钟运行一次 cron,并且每分钟每 cron 的请求数没有限制,那么这里的最佳实践是什么?
选项1:
// Launch cluster outside cron
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT, // use one browser per worker
maxConcurrency: 4, // cluster with four workers
timeout: 3600000 // 1 Hour - worst case scenario
});
nodeCron.schedule("* * * * *", async () => {
for (const items of items) {
// Get item specific url
cluster.queue(({ page, url }) => {
await page.goto(url, { timeout: 3600000 });
});
}
});
选项 2:
nodeCron.schedule("* * * * *", async () => {
// Launch cluster inside cron function
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT, // use one browser per worker
maxConcurrency: 4, // cluster with four workers
});
for (const items of items) {
// Get item specific url
cluster.queue(({ page, url }) => {
await page.goto(url, { timeout: 3600000 });
});
}
await cluster.idle();
await cluster.close();
});
我目前正在使用选项 2,如果我必须使用选项 1,我无法理解我是否必须无限期地保持浏览器打开,即何时关闭它
- 请注意,每分钟可以有任意数量的项目,没有上限,并且每个项目最多可以持续 1 小时,因为我在那里设置了一些最坏的情况限制,因为请求可以加载大量数据 ~ 250mb(应该是块但我不能改变目前的架构,所以这有时对更大的数据库表没有响应)