OGP生成用のpuppeteerアプリケーションに複数アクセスがあった場合、同時にpuppeteerが複数起動してしまってサーバのリソースを食い尽くす憂き目に遭ったのでpuppeteer-clusterを使って同時起動数を制御することにした。
同時に起動する最大プロセス数です。
puppeteerに渡していたオプションがclusterでも使えます。
headless: true,
executablePath: "/usr/bin/chromium-browser",
args: ["--no-sandbox"],
結果を取得するためにqueueではなくexecuteを使います。
try {
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT,
//同時最大起動数1
maxConcurrency: 1,
//puppeteerの起動オプション
puppeteerOptions: {
headless: true,
executablePath: "/usr/bin/chromium-browser",
args: ["--no-sandbox"],
},
});
await cluster.task(async ({ page, data: id }) => {
await page.goto("https://cap-baseball.com/player/" + id);
await page.setCacheEnabled(false);
await page.waitForSelector("#main");
const fullPage = await page.$("#main");
const fullPageSize = await fullPage.boundingBox();
const VIEWPORT = { width: 920, height: 700, deviceScaleFactor: 1 };
await page.setViewport(
Object.assign({}, VIEWPORT, { height: fullPageSize.height })
);
await page.waitFor(3000);
const elements = await page.$$("#main");
let img;
for (const [index, element] of elements.entries()) {
img = await element.screenshot();
}
await page.close();
await console.log("screenshot done.");
//撮ったスクリーンショットを返却する
return img;
});
//結果を取得するためにqueueではなくexecuteを使う
const result = await cluster.execute(capId);
await cluster.idle();
await cluster.close();
return result;
} catch (err) {
console.error(err);
throw new Error(err);
}