Performance: Handling worker crashes and restart
This concept affects server responsiveness and stability, impacting how quickly the server recovers from worker failures without blocking requests.
Jump into concepts and practice - no test required
import cluster from 'node:cluster'; import os from 'node:os'; if (cluster.isPrimary) { const numCPUs = os.cpus().length; for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died, restarting...`); cluster.fork(); }); } else { // Worker code import('./server.js'); }
import cluster from 'node:cluster'; import os from 'node:os'; if (cluster.isPrimary) { const numCPUs = os.cpus().length; for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); // No restart logic here }); } else { // Worker code import('./server.js'); }
| Pattern | Worker Availability | Request Delay | Recovery Time | Verdict |
|---|---|---|---|---|
| No restart on crash | Decreases over time | Increases significantly | Manual restart needed | [X] Bad |
| Automatic restart on crash | Maintained at full capacity | Minimal increase | Immediate recovery | [OK] Good |
exit event on a worker in Node.js cluster module?exit event roleexit event is triggered when a worker process stops, either normally or due to a crash.exitexit helps detect unexpected worker crashes so the master can respond.exit event = detect crash [OK]on to listen to events.exit and the method is on, so worker.on('exit', ...) is correct.on with exit on worker [OK]const cluster = require('cluster');
if (cluster.isMaster) {
const worker = cluster.fork();
worker.on('exit', (code, signal) => {
console.log(`Worker exited with code ${code} and signal ${signal}`);
});
} else {
process.exit(1); // Simulate crash
}process.exit(1) ends the worker with exit code 1, indicating an error.exit event callback receives the exit code and signal; here signal is null because no signal caused the exit.const cluster = require('cluster');
if (cluster.isMaster) {
cluster.fork();
cluster.on('exit', (worker) => {
console.log('Worker crashed, restarting...');
cluster.fork();
});
}