はじめに
puppeteerを利用しパフォーマンステストを実施した際に、Node.jsはシングルスレッドなので同時アクセスを再現するためにマルチスレッド化する必要がありました。
今回は、node.jsのClusterモジュールを利用した同時アクセスの再現方法を記載したいと思います。
前提
- nodejsおよびpuppeteerはインストール済み
マルチスレッド化
今回は動作確認用のexample.jsをマルチスレッド化してみたいと思います。
マルチスレッド化する前はこんな感じです。
example.js
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
マルチスレッド化したexample.jsはこんな感じになります。
example_multi.js
const cluster = require('cluster');
const puppeteer = require('puppeteer');
//コマンドライン引数で設定されたセッション数を取得
var sessionNum = process.argv[2];
if (cluster.isMaster){
console.log(`Master ${process.pid} is running`);
//セッション数に応じてワーカープロセスを起動
for(let i = 0; i < sessionNum; i++){
cluster.fork();
}
//exitイベントが発生したらワーカープロセスが終了したことを出力
cluster.on('exit',(worker, code, signal) => {
console.log(`worker ${worker.process.pid} dead`);
});
} else {
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example' + cluster.worker.id.toString() + '.png'});
await browser.close();
await process.exit(0);
})();
}
確認
画像が5枚、連番で出力されればOK
node example_multi.js 5
処理時間が短いので、数秒しか表示されませんが指定したセッション数分プロセスが立ち上がっているか確認
sudo watch -n5 "ps aux | grep node"