Node.js Performance: Event Loop, Clustering āđāļĨāļ° Optimization āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ 2026

āļ„āļđāđˆāļĄāļ·āļ­āđ€āļŠāļīāļ‡āļĨāļķāļāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž Node.js āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļāļĨāđ„āļ Event Loop, āļāļēāļĢāļ—āļģ Clustering, Worker Threads, āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļĨāļ°āđ€āļ—āļ„āļ™āļīāļ„ Optimization āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļš production āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļˆāļĢāļīāļ‡āļ—āļĩāđˆāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ

āļ„āļđāđˆāļĄāļ·āļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž Node.js āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Event Loop Clustering āđāļĨāļ° Optimization

āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡ Node.js āđ€āļ›āđ‡āļ™āļŦāļąāļ§āļ‚āđ‰āļ­āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļļāļāļ„āļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļāļąāļš backend āļ„āļ§āļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļ­āļĒāđˆāļēāļ‡āļ–āđˆāļ­āļ‡āđāļ—āđ‰ āđāļĄāđ‰āļ§āđˆāļē Node.js āļˆāļ°āļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš concurrent connections āđ„āļ”āđ‰āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļ”āđ‰āļ§āļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļšāļš single-threaded event-driven āđāļ•āđˆāđƒāļ™āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāļ—āļĩāđˆāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļŠāļļāļ”āļ™āļąāđ‰āļ™āļ•āđ‰āļ­āļ‡āļ­āļēāļĻāļąāļĒāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļāļĨāđ„āļāļ āļēāļĒāđƒāļ™āļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Event Loop āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ CPU-bound tasks āļ”āđ‰āļ§āļĒ Worker Threads

āđƒāļ™āļ›āļĩ 2026 āļĢāļ°āļšāļš backend āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ”āđ‰āļ§āļĒ Node.js āļĄāļĩāļ‚āļ™āļēāļ”āđāļĨāļ°āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļšāļ—āļąāđ‰āļ‡ real-time communication, āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āđāļĨāļ° API āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļīāļĄāļēāļ“ request āļŠāļđāļ‡ āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļ‚āļ­āļ‡ Node.js āļˆāļķāļ‡āđ„āļĄāđˆāđƒāļŠāđˆāđāļ„āđˆāļ„āļ§āļēāļĄāļĢāļđāđ‰āđ€āļŠāļīāļ‡āļ—āļĪāļĐāļŽāļĩ āđāļ•āđˆāđ€āļ›āđ‡āļ™āļ—āļąāļāļĐāļ°āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāđ€āļŠāļ–āļĩāļĒāļĢāđāļĨāļ°āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āđ„āļ”āđ‰āļˆāļĢāļīāļ‡ āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļˆāļ°āļžāļēāđ„āļ›āļŠāļģāļĢāļ§āļˆāļ—āļļāļāđāļ‡āđˆāļĄāļļāļĄāļ‚āļ­āļ‡ Node.js performance āļ•āļąāđ‰āļ‡āđāļ•āđˆāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļš production

āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļāđˆāļ­āļ™

Node.js āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ single-threaded āļ­āļĒāđˆāļēāļ‡āđāļ—āđ‰āļˆāļĢāļīāļ‡ JavaScript code āļ—āļģāļ‡āļēāļ™āļšāļ™ main thread āđ€āļžāļĩāļĒāļ‡āļŦāļ™āļķāđˆāļ‡āđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆ Node.js āđƒāļŠāđ‰ thread pool āļ‚āļ­āļ‡ libuv (āļ„āđˆāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ 4 threads) āļŠāļģāļŦāļĢāļąāļš I/O operations āļšāļēāļ‡āļ›āļĢāļ°āđ€āļ āļ— āđ€āļŠāđˆāļ™ file system, DNS lookup āđāļĨāļ° crypto āļ”āļąāļ‡āļ™āļąāđ‰āļ™ bottleneck āļ—āļĩāđˆāđāļ—āđ‰āļˆāļĢāļīāļ‡āļ„āļ·āļ­āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāļšāļĨāđ‡āļ­āļ main thread āđ„āļĄāđˆāđƒāļŠāđˆ I/O operations āļ—āļąāđˆāļ§āđ„āļ›

Event Loop: āļŦāļąāļ§āđƒāļˆāļ‚āļ­āļ‡ Node.js

Event Loop āđ€āļ›āđ‡āļ™āļāļĨāđ„āļāļŦāļĨāļąāļāļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰ Node.js āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢ asynchronous operations āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļĨāļģāļ”āļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° phase āđƒāļ™ Event Loop āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ debug āļ›āļąāļāļŦāļēāļ”āđ‰āļēāļ™āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž

Event Loop āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ phase āļŦāļĨāļąāļ 6 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āļ§āļ‡āļĢāļ­āļš āđ„āļ”āđ‰āđāļāđˆ Timers phase āļŠāļģāļŦāļĢāļąāļš callbacks āļ‚āļ­āļ‡ setTimeout/setInterval, Pending callbacks āļŠāļģāļŦāļĢāļąāļš I/O callbacks āļ—āļĩāđˆāļ„āđ‰āļēāļ‡āļ­āļĒāļđāđˆ, Idle/Prepare āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļ āļēāļĒāđƒāļ™, Poll phase āļŠāļģāļŦāļĢāļąāļš I/O events āđƒāļŦāļĄāđˆ, Check phase āļŠāļģāļŦāļĢāļąāļš setImmediate callbacks āđāļĨāļ° Close callbacks āļŠāļģāļŦāļĢāļąāļš event āļ›āļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰āļĒāļąāļ‡āļĄāļĩ microtask queue āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļļāļ phase transition

event-loop-phases.jsjavascript
// Demonstrating phase execution order

const fs = require('fs');

// Phase 1: Timers — executes setTimeout/setInterval callbacks
setTimeout(() => console.log('1. Timer phase'), 0);

// Phase 4: Poll — executes I/O callbacks
fs.readFile(__filename, () => {
  console.log('2. Poll phase (I/O callback)');

  // Phase 5: Check — executes setImmediate callbacks
  setImmediate(() => console.log('3. Check phase (setImmediate)'));

  // Phase 1 again: Timer scheduled from within I/O
  setTimeout(() => console.log('4. Timer phase (from I/O)'), 0);
});

// Microtask — runs between every phase transition
Promise.resolve().then(() => console.log('Microtask: Promise'));
process.nextTick(() => console.log('Microtask: nextTick'));

āļˆāļēāļāđ‚āļ„āđ‰āļ”āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļĨāļģāļ”āļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļ„āļ·āļ­ nextTick āļˆāļ°āļ—āļģāļ‡āļēāļ™āļāđˆāļ­āļ™ Promise āđ€āļŠāļĄāļ­ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ nextTick queue āļĄāļĩāļĨāļģāļ”āļąāļšāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļŠāļđāļ‡āļāļ§āđˆāļē microtask queue āļŠāđˆāļ§āļ™ setImmediate āļ āļēāļĒāđƒāļ™ I/O callback āļˆāļ°āļ—āļģāļ‡āļēāļ™āļāđˆāļ­āļ™ setTimeout āđ€āļŠāļĄāļ­ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ Check phase āļ­āļĒāļđāđˆāļ–āļąāļ”āļˆāļēāļ Poll phase āđ‚āļ”āļĒāļ•āļĢāļ‡

āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļļāļ‚āļ āļēāļžāļ‚āļ­āļ‡ Event Loop

āđƒāļ™āļĢāļ°āļšāļš production āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļē Event Loop āļ—āļģāļ‡āļēāļ™āļ›āļāļ•āļīāļŦāļĢāļ·āļ­āđ„āļĄāđˆāļ–āļ·āļ­āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļŠāļģāļ„āļąāļāļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡ āļŦāļēāļ Event Loop āļ–āļđāļāļšāļĨāđ‡āļ­āļāļŦāļĢāļ·āļ­āļ—āļģāļ‡āļēāļ™āļŦāļ™āļąāļāđ€āļāļīāļ™āđ„āļ› āļ—āļļāļ request āļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļˆāļ°āđ„āļ”āđ‰āļĢāļąāļš response āļŠāđ‰āļēāļĨāļ‡ āđ‚āļĄāļ”āļđāļĨ perf_hooks āļ—āļĩāđˆāļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļš Node.js āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļ•āļĢāļ§āļˆāļ§āļąāļ”āļ„āđˆāļēāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰

event-loop-monitor.jsjavascript
// Production-grade event loop monitoring

const { performance, monitorEventLoopDelay } = require('perf_hooks');

// High-resolution event loop delay histogram
const histogram = monitorEventLoopDelay({ resolution: 20 });
histogram.enable();

// Track utilization over intervals
let previous = performance.eventLoopUtilization();

setInterval(() => {
  const current = performance.eventLoopUtilization(previous);
  previous = performance.eventLoopUtilization();

  const metrics = {
    // Ratio of time the loop spent active vs idle (0-1)
    utilization: current.utilization.toFixed(3),
    // Delay percentiles in milliseconds
    p50: (histogram.percentile(50) / 1e6).toFixed(2),
    p99: (histogram.percentile(99) / 1e6).toFixed(2),
    max: (histogram.max / 1e6).toFixed(2),
  };

  // Alert when utilization exceeds 70% or p99 > 100ms
  if (current.utilization > 0.7 || histogram.percentile(99) > 100e6) {
    console.warn('EVENT_LOOP_SATURATED', metrics);
  }

  histogram.reset();
}, 5000);

āļ„āđˆāļē utilization āļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļ eventLoopUtilization() āđāļŠāļ”āļ‡āļŠāļąāļ”āļŠāđˆāļ§āļ™āđ€āļ§āļĨāļēāļ—āļĩāđˆ Event Loop āļ—āļģāļ‡āļēāļ™āđ€āļ—āļĩāļĒāļšāļāļąāļšāđ€āļ§āļĨāļēāļ§āđˆāļēāļ‡ āđ‚āļ”āļĒāļ„āđˆāļēāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŠāđˆāļ§āļ‡ 0-0.5 āļ–āļ·āļ­āļ§āđˆāļēāļ›āļāļ•āļī āļ„āđˆāļē 0.5-0.7 āļ„āļ§āļĢāđ€āļāđ‰āļēāļĢāļ°āļ§āļąāļ‡ āđāļĨāļ°āļ„āđˆāļēāļ—āļĩāđˆāļŠāļđāļ‡āļāļ§āđˆāļē 0.7 āļŦāļĄāļēāļĒāļ„āļ§āļēāļĄāļ§āđˆāļē Event Loop āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļŦāļ™āļąāļāđ€āļāļīāļ™āđ„āļ›āđāļĨāļ°āļ­āļēāļˆāļŠāđˆāļ‡āļœāļĨāļ•āđˆāļ­ latency āļ‚āļ­āļ‡ request

āļŠāđˆāļ§āļ™āļ„āđˆāļē p99 delay āđāļŠāļ”āļ‡āļ„āđˆāļē latency āļ—āļĩāđˆ percentile āļ—āļĩāđˆ 99 āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ„āļ§āļēāļĄāļ§āđˆāļē 99% āļ‚āļ­āļ‡āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Event Loop āļĄāļĩ delay āđ„āļĄāđˆāđ€āļāļīāļ™āļ„āđˆāļēāļ™āļĩāđ‰ āļŦāļēāļāļ„āđˆāļē p99 āļŠāļđāļ‡āđ€āļāļīāļ™ 100ms āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ§āđˆāļēāļĄāļĩāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļšāļĨāđ‡āļ­āļ Event Loop āļ­āļĒāļđāđˆ

āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļšāļĨāđ‡āļ­āļ Event Loop āđāļĨāļ°āļ§āļīāļ˜āļĩāđāļāđ‰āđ„āļ‚

āļ›āļąāļāļŦāļēāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļĢāļ°āļšāļš Node.js āļ„āļ·āļ­āļāļēāļĢāļšāļĨāđ‡āļ­āļ Event Loop āļ”āđ‰āļ§āļĒ synchronous operations āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ™āļēāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ āđ„āļ”āđ‰āđāļāđˆ āļāļēāļĢ parse JSON āļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āļāļēāļĢāļ—āļģ cryptographic operations āđāļšāļš synchronous āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĨāļđāļ›āļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ

blocking-patterns.jsjavascript
// Anti-patterns and their solutions

// PROBLEM: JSON.parse blocks on large payloads
const largePayload = Buffer.alloc(50 * 1024 * 1024); // 50MB
// JSON.parse(largePayload.toString()); // Blocks event loop 200-500ms

// SOLUTION: Stream-parse large JSON with a streaming parser
const { Transform } = require('stream');
const JSONStream = require('jsonstream2');

function processLargeJSON(readableStream) {
  return new Promise((resolve, reject) => {
    const results = [];
    readableStream
      .pipe(JSONStream.parse('items.*'))  // Stream-parse array items
      .on('data', (item) => results.push(item))
      .on('end', () => resolve(results))
      .on('error', reject);
  });
}

// PROBLEM: Synchronous crypto in request path
// const hash = crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha512');

// SOLUTION: Use async variant
const crypto = require('crypto');
async function hashPassword(password, salt) {
  return new Promise((resolve, reject) => {
    crypto.pbkdf2(password, salt, 100000, 64, 'sha512', (err, key) => {
      if (err) reject(err);
      else resolve(key.toString('hex'));
    });
  });
}

āļŦāļĨāļąāļāļāļēāļĢāļŠāļģāļ„āļąāļāļ„āļ·āļ­ āļ—āļļāļ operation āļ—āļĩāđˆāļ­āļēāļˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ™āļēāļ™āļāļ§āđˆāļē 1-2 āļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ āļ„āļ§āļĢāđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļš asynchronous āđ€āļŠāļĄāļ­ āļŠāļģāļŦāļĢāļąāļš JSON āļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āļāļēāļĢāđƒāļŠāđ‰ streaming parser āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāļĨāļ°āļŠāđˆāļ§āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļšāļĨāđ‡āļ­āļ Event Loop āļŠāđˆāļ§āļ™ crypto operations āļ„āļ§āļĢāđƒāļŠāđ‰ async variant āļ—āļĩāđˆ Node.js āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰ āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āļ—āļģāļ‡āļēāļ™āđƒāļ™ libuv thread pool āđāļ—āļ™

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Node.js / NestJS āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

Clustering: āļāļēāļĢāļ‚āļĒāļēāļĒāļ‚āļĩāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ”āđ‰āļ§āļĒ Multi-Process

āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ JavaScript āļ—āļģāļ‡āļēāļ™āļšāļ™ single thread āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ Node.js āļ—āļĩāđˆāļĢāļąāļ™āđ€āļ›āđ‡āļ™ process āđ€āļ”āļĩāļĒāļ§āļˆāļ°āđƒāļŠāđ‰ CPU āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡ core āđ€āļ”āļĩāļĒāļ§āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļ—āļĩāđˆāļĄāļĩ CPU āļŦāļĨāļēāļĒ core āļāļēāļĢāļ—āļģ clustering āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāđ„āļ”āđ‰āđ€āļ•āđ‡āļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ‚āļ”āļĒāļāļēāļĢ fork āļŦāļĨāļēāļĒ worker processes

āđ‚āļĄāļ”āļđāļĨ cluster āļ—āļĩāđˆāļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļš Node.js āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡ multi-process architecture āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡ āđ‚āļ”āļĒ primary process āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļāļĢāļ°āļˆāļēāļĒ incoming connections āđ„āļ›āļĒāļąāļ‡ worker processes

cluster-setup.jsjavascript
// Production clustering with graceful shutdown

const cluster = require('cluster');
const os = require('os');
const process = require('process');

const WORKER_COUNT = parseInt(process.env.WORKERS) || os.cpus().length;

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} starting ${WORKER_COUNT} workers`);

  // Fork workers for each CPU core
  for (let i = 0; i < WORKER_COUNT; i++) {
    cluster.fork();
  }

  // Restart crashed workers automatically
  cluster.on('exit', (worker, code, signal) => {
    if (!worker.exitedAfterDisconnect) {
      console.error(`Worker ${worker.process.pid} died (${signal || code}). Restarting...`);
      cluster.fork();
    }
  });

  // Graceful shutdown on SIGTERM
  process.on('SIGTERM', () => {
    console.log('Primary received SIGTERM. Shutting down workers...');
    for (const id in cluster.workers) {
      cluster.workers[id].disconnect();
    }
  });
} else {
  // Worker process — start the actual HTTP server
  const http = require('http');
  const server = http.createServer((req, res) => {
    res.writeHead(200);
    res.end(`Handled by worker ${process.pid}\n`);
  });

  server.listen(3000, () => {
    console.log(`Worker ${process.pid} listening on port 3000`);
  });

  // Graceful shutdown for individual worker
  process.on('SIGTERM', () => {
    server.close(() => process.exit(0));
  });
}

āļˆāļļāļ”āļŠāļģāļ„āļąāļāđƒāļ™āđ‚āļ„āđ‰āļ”āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļ„āļ·āļ­āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ graceful shutdown āļ­āļĒāđˆāļēāļ‡āļ–āļđāļāļ•āđ‰āļ­āļ‡ āđ€āļĄāļ·āđˆāļ­ primary process āđ„āļ”āđ‰āļĢāļąāļš SIGTERM āļˆāļ°āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ disconnect āđ„āļ›āļĒāļąāļ‡ workers āļ—āļļāļāļ•āļąāļ§ āđāļ•āđˆāļĨāļ° worker āļˆāļ°āļŦāļĒāļļāļ”āļĢāļąāļš connection āđƒāļŦāļĄāđˆāđāļĨāļ°āļĢāļ­āđƒāļŦāđ‰ request āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļŠāļĢāđ‡āļˆāļāđˆāļ­āļ™āļˆāļķāļ‡āļ›āļīāļ”āļ•āļąāļ§āđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰āļĒāļąāļ‡āļĄāļĩāļāļĨāđ„āļāļāļēāļĢ restart worker āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāđ€āļĄāļ·āđˆāļ­ worker crash āđ‚āļ”āļĒāđ„āļĄāđˆāļ„āļēāļ”āļ„āļīāļ” āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļš production

Worker Threads: āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‡āļēāļ™ CPU-Intensive

Cluster module āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒ network requests āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ CPU āļŦāļ™āļąāļ āđ€āļŠāđˆāļ™ āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļēāļž āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ āļŦāļĢāļ·āļ­āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāļ‚āđ‰āļ­āļĄāļđāļĨ āļāļēāļĢāđƒāļŠāđ‰ Worker Threads āļˆāļ°āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļ§āđˆāļē āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļēāļĄāļēāļĢāļ–āđāļŠāļĢāđŒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļœāđˆāļēāļ™ SharedArrayBuffer āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡ serialize āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āđ‰āļēāļĄāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ

āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Worker Pool āļ—āļĩāđˆāļ™āļģāļāļĨāļąāļšāļĄāļēāđƒāļŠāđ‰āļ‹āđ‰āļģāđ„āļ”āđ‰āļŠāđˆāļ§āļĒāļĨāļ” overhead āļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ worker āđƒāļŦāļĄāđˆāļ—āļļāļāļ„āļĢāļąāđ‰āļ‡

worker-pool.jsjavascript
// Reusable worker thread pool for CPU tasks

const { Worker } = require('worker_threads');
const os = require('os');

class WorkerPool {
  constructor(workerScript, poolSize = os.cpus().length) {
    this.workers = [];
    this.queue = [];

    for (let i = 0; i < poolSize; i++) {
      this.workers.push({ busy: false, worker: new Worker(workerScript) });
    }
  }

  execute(taskData) {
    return new Promise((resolve, reject) => {
      const available = this.workers.find(w => !w.busy);

      if (available) {
        this._runTask(available, taskData, resolve, reject);
      } else {
        // Queue task until a worker is free
        this.queue.push({ taskData, resolve, reject });
      }
    });
  }

  _runTask(entry, taskData, resolve, reject) {
    entry.busy = true;
    entry.worker.postMessage(taskData);

    const onMessage = (result) => {
      entry.busy = false;
      cleanup();
      resolve(result);
      this._processQueue();
    };

    const onError = (err) => {
      entry.busy = false;
      cleanup();
      reject(err);
      this._processQueue();
    };

    const cleanup = () => {
      entry.worker.removeListener('message', onMessage);
      entry.worker.removeListener('error', onError);
    };

    entry.worker.on('message', onMessage);
    entry.worker.on('error', onError);
  }

  _processQueue() {
    if (this.queue.length === 0) return;
    const available = this.workers.find(w => !w.busy);
    if (available) {
      const { taskData, resolve, reject } = this.queue.shift();
      this._runTask(available, taskData, resolve, reject);
    }
  }
}

module.exports = { WorkerPool };

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰ Worker Pool āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļēāļžāļ”āđ‰āļ§āļĒ sharp library

image-worker.jsjavascript
// Worker thread for CPU-intensive image processing

const { parentPort } = require('worker_threads');
const sharp = require('sharp');

parentPort.on('message', async ({ inputPath, width, height }) => {
  const result = await sharp(inputPath)
    .resize(width, height)
    .webp({ quality: 80 })
    .toBuffer();

  parentPort.postMessage({ size: result.length, buffer: result });
});

āļĢāļđāļ›āđāļšāļšāļ™āļĩāđ‰āļŠāđˆāļ§āļĒāđƒāļŦāđ‰ main thread āđ„āļĄāđˆāļ–āļđāļāļšāļĨāđ‡āļ­āļāļˆāļēāļāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļēāļž āđ‚āļ”āļĒ WorkerPool āļˆāļ°āļˆāļąāļ”āļāļēāļĢāļ„āļīāļ§āļ‡āļēāļ™āđāļĨāļ°āļāļĢāļ°āļˆāļēāļĒāđ„āļ›āļĒāļąāļ‡ worker threads āļ—āļĩāđˆāļ§āđˆāļēāļ‡āļ­āļĒāļđāđˆāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī

āļ‚āđ‰āļ­āļ„āļ§āļĢāļĢāļ°āļ§āļąāļ‡āđ€āļĢāļ·āđˆāļ­āļ‡ Cluster āļāļąāļš Worker Threads

Cluster module āđāļĨāļ° Worker Threads āļĄāļĩāļˆāļļāļ”āļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđāļĨāļ°āđ„āļĄāđˆāļ„āļ§āļĢāļŠāļąāļšāļŠāļ™ Cluster āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļĢāļ°āļˆāļēāļĒ network requests āļ‚āđ‰āļēāļĄāļŦāļĨāļēāļĒ processes āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ° process āļĄāļĩ memory space āđāļĒāļāļāļąāļ™ āļŠāđˆāļ§āļ™ Worker Threads āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš offload āļ‡āļēāļ™ CPU-intensive āļˆāļēāļ main thread āđ‚āļ”āļĒāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ process āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļāļēāļĢāđƒāļŠāđ‰ Worker Threads āļŠāļģāļŦāļĢāļąāļš I/O-bound tasks āļˆāļ°āđ„āļĄāđˆāđ„āļ”āđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ Node.js āļˆāļąāļ”āļāļēāļĢ I/O āđāļšāļš asynchronous āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āđāļĨāļ°āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ” overhead āļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ threads āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™

āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļĨāļ” GC Pressure

Garbage Collector (GC) āđƒāļ™ V8 engine āđ€āļ›āđ‡āļ™āļ­āļĩāļāļ›āļąāļˆāļˆāļąāļĒāļ—āļĩāđˆāļŠāđˆāļ‡āļœāļĨāļ•āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āđ€āļĄāļ·āđˆāļ­ GC āļ—āļģāļ‡āļēāļ™ āļĄāļąāļ™āļˆāļ°āļŦāļĒāļļāļ” JavaScript execution āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ (stop-the-world pause) āļĒāļīāđˆāļ‡āļĄāļĩ objects āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢāļĄāļēāļāđ€āļ—āđˆāļēāđ„āļĢ GC pause āļāđ‡āļˆāļ°āļĒāļīāđˆāļ‡āļ™āļēāļ™āļ‚āļķāđ‰āļ™ āļŠāđˆāļ‡āļœāļĨāđƒāļŦāđ‰ latency āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļŠāļđāļ‡āļ‚āļķāđ‰āļ™

memory-optimization.jsjavascript
// Patterns that reduce GC pressure

// ANTI-PATTERN: Creating objects in hot loops
function processItemsBad(items) {
  return items.map(item => ({
    id: item.id,
    name: item.name.trim(),
    score: calculateScore(item),  // New object per iteration
    metadata: { processed: true, timestamp: Date.now() }
  }));
}

// OPTIMIZED: Reuse buffers and minimize allocations
const reusableBuffer = Buffer.alloc(4096);

function processItemsGood(items, output) {
  // Reuse the output array instead of creating new one
  output.length = 0;
  for (let i = 0; i < items.length; i++) {
    // Mutate in place when safe to do so
    output.push(items[i].id);
  }
  return output;
}

// Monitor heap usage for leak detection
function checkMemory() {
  const used = process.memoryUsage();
  return {
    heapUsedMB: Math.round(used.heapUsed / 1024 / 1024),
    heapTotalMB: Math.round(used.heapTotal / 1024 / 1024),
    externalMB: Math.round(used.external / 1024 / 1024),
    rsssMB: Math.round(used.rss / 1024 / 1024),
  };
}

// V8 flags for production GC tuning
// node --max-old-space-size=4096 --max-semi-space-size=128 app.js
// --max-old-space-size: Set old generation limit (default ~1.7GB)
// --max-semi-space-size: Increase young generation (default 16MB)

āđ€āļ—āļ„āļ™āļīāļ„āļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļĨāļ” GC pressure āđ„āļ”āđ‰āđāļāđˆ āļāļēāļĢāđƒāļŠāđ‰ object pooling āļŠāļģāļŦāļĢāļąāļš objects āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ—āļģāļĨāļēāļĒāļšāđˆāļ­āļĒ āļāļēāļĢāđƒāļŠāđ‰ Buffer āđāļšāļš reusable āđāļ—āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđƒāļŦāļĄāđˆāļ—āļļāļāļ„āļĢāļąāđ‰āļ‡ āļāļēāļĢāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ closures āđƒāļ™ hot path āđāļĨāļ°āļāļēāļĢāđƒāļŠāđ‰ TypedArrays āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđ€āļĨāļ‚

āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ tune GC āđƒāļ™āļĢāļ°āļ”āļąāļš production āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ V8 flags āđ€āļžāļ·āđˆāļ­āļ›āļĢāļąāļšāļ‚āļ™āļēāļ” heap āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļš workload āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ āļ„āđˆāļē --max-old-space-size āļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļŠāļđāļ‡āļŠāļļāļ”āļ‚āļ­āļ‡ old generation heap āļŠāđˆāļ§āļ™ --max-semi-space-size āļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡ young generation āļ—āļĩāđˆāđƒāļŦāļāđˆāļ‚āļķāđ‰āļ™āļˆāļ°āļŠāđˆāļ§āļĒāļĨāļ”āļ„āļ§āļēāļĄāļ–āļĩāđˆāļ‚āļ­āļ‡ minor GC pauses

āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Observability āļ”āđ‰āļ§āļĒ OpenTelemetry

āļāļēāļĢ monitoring āļ—āļĩāđˆāļ”āļĩāđ€āļ›āđ‡āļ™āļĢāļēāļāļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž OpenTelemetry āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āđ€āļ›āļīāļ”āļŠāļģāļŦāļĢāļąāļš observability āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļ—āļąāđ‰āļ‡ traces, metrics āđāļĨāļ° logs āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļģāļŦāļĢāļąāļš Node.js āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰

otel-setup.jsjavascript
// OpenTelemetry setup for Node.js performance monitoring

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus');
const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics');

const sdk = new NodeSDK({
  metricReader: new PrometheusExporter({ port: 9464 }),
  instrumentations: [
    getNodeAutoInstrumentations({
      // Instrument HTTP, Express, DNS, fs, and more
      '@opentelemetry/instrumentation-fs': { enabled: false }, // Too noisy
    }),
  ],
});

sdk.start();

// Custom event loop lag metric
const { metrics } = require('@opentelemetry/api');
const meter = metrics.getMeter('app');

const eventLoopLag = meter.createHistogram('nodejs.event_loop.lag', {
  description: 'Event loop lag in milliseconds',
  unit: 'ms',
});

// Report event loop lag every second
const { monitorEventLoopDelay } = require('perf_hooks');
const h = monitorEventLoopDelay({ resolution: 10 });
h.enable();

setInterval(() => {
  eventLoopLag.record(h.percentile(99) / 1e6);
  h.reset();
}, 1000);

OpenTelemetry auto-instrumentation āļˆāļ°āļ•āļĢāļ§āļˆāļˆāļąāļš HTTP requests, database queries āđāļĨāļ° external calls āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄ custom metrics āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ event loop lag āļ—āļĩāđˆāđāļŠāļ”āļ‡āđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āđ„āļ›āļĒāļąāļ‡ Prometheus āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ dashboard āļšāļ™ Grafana āļŠāļģāļŦāļĢāļąāļš monitoring āđāļšāļš real-time

āļ•āļēāļĢāļēāļ‡āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš: āđ€āļĨāļ·āļ­āļāļāļĨāļĒāļļāļ—āļ˜āđŒāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ

āļāļēāļĢāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡ workload āļ•āļēāļĢāļēāļ‡āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļŠāļĢāļļāļ›āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđāļ•āđˆāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡

| āđ€āļāļ“āļ‘āđŒ | Cluster Module | Worker Threads | Child Process | |---|---|---|---| | āļāļĢāļ“āļĩāđƒāļŠāđ‰āļ‡āļēāļ™ | āļāļĢāļ°āļˆāļēāļĒ HTTP requests | āļ‡āļēāļ™ CPU-intensive | āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāļ™āļ­āļ | | āļāļēāļĢāđāļŠāļĢāđŒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ | āđ„āļĄāđˆāđāļŠāļĢāđŒ (āđāļĒāļ process) | āđāļŠāļĢāđŒāđ„āļ”āđ‰āļœāđˆāļēāļ™ SharedArrayBuffer | āđ„āļĄāđˆāđāļŠāļĢāđŒ | | Overhead | āļŠāļđāļ‡ (fork process) | āļ›āļēāļ™āļāļĨāļēāļ‡ (āļŠāļĢāđ‰āļēāļ‡ thread) | āļŠāļđāļ‡āļĄāļēāļ (spawn process) | | āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ | IPC messages | postMessage / SharedArrayBuffer | stdin/stdout/IPC | | āļ„āļ§āļēāļĄāđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļš I/O | āđ€āļŦāļĄāļēāļ°āļĄāļēāļ | āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™ | āļ›āļēāļ™āļāļĨāļēāļ‡ | | āļ„āļ§āļēāļĄāđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļš CPU | āļ”āļĩ (āđāļĒāļ core) | āļ”āļĩāļĄāļēāļ (āđāļŠāļĢāđŒ memory) | āļ”āļĩ (āđāļĒāļ process) | | Graceful shutdown | āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢāđ€āļ­āļ‡ | āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢāđ€āļ­āļ‡ | terminate() | | āđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļž | Process crash āđ„āļĄāđˆāļāļĢāļ°āļ—āļšāļ•āļąāļ§āļ­āļ·āđˆāļ™ | Thread crash āļ­āļēāļˆāļāļĢāļ°āļ—āļš process | āđāļĒāļāļŠāļĄāļšāļđāļĢāļ“āđŒ |

āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ„āļ§āļĢāļ—āļĢāļēāļšāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Node.js 24

Node.js 24 (LTS āļ›āļĩ 2026) āļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ”āđ‰āļēāļ™āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ—āļĩāđˆāļŠāļģāļ„āļąāļ āđ„āļ”āđ‰āđāļāđˆ V8 engine āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļĄāļĩ garbage collection āļ—āļĩāđˆāđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™, āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡ startup time āļ”āđ‰āļ§āļĒ compile cache āļ—āļĩāđˆāļ”āļĩāļ‚āļķāđ‰āļ™, āļĢāļ­āļ‡āļĢāļąāļš Web Streams API āļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļš āđāļĨāļ° built-in support āļŠāļģāļŦāļĢāļąāļš TypeScript stripping āđ‚āļ”āļĒāļ•āļĢāļ‡ āļāļēāļĢāļ­āļąāļ›āđ€āļāļĢāļ”āđ€āļ›āđ‡āļ™ Node.js 24 āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ„āļ”āđ‰ 10-15% āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ‚āļ„āđ‰āļ”

āļĢāļēāļĒāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļģāļŦāļĢāļąāļš Production

āļāđˆāļ­āļ™āļ™āļģāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ Node.js āļ‚āļķāđ‰āļ™ production āļ„āļ§āļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļāļēāļĢāļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļąāđˆāļ™āđƒāļˆāļ§āđˆāļēāļĢāļ°āļšāļšāļžāļĢāđ‰āļ­āļĄāļĢāļ­āļ‡āļĢāļąāļš traffic āļˆāļĢāļīāļ‡

āļ”āđ‰āļēāļ™ Event Loop:

  • āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāđ„āļĄāđˆāļĄāļĩ synchronous operations āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ™āļēāļ™āļāļ§āđˆāļē 5ms āļšāļ™ main thread
  • āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļš monitoring āļŠāļģāļŦāļĢāļąāļš event loop delay āđāļĨāļ° utilization
  • āļ•āļąāđ‰āļ‡ alert āđ€āļĄāļ·āđˆāļ­ event loop utilization āđ€āļāļīāļ™ 70%

āļ”āđ‰āļēāļ™ Scaling:

  • āđƒāļŠāđ‰ cluster module āļŦāļĢāļ·āļ­ process manager (PM2) āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ CPU āļ—āļļāļ core
  • āļāļģāļŦāļ™āļ” worker count āđ€āļ—āđˆāļēāļāļąāļšāļˆāļģāļ™āļ§āļ™ CPU cores āļŠāļģāļŦāļĢāļąāļš CPU-bound workloads
  • āļ•āļąāđ‰āļ‡āļ„āđˆāļē graceful shutdown āļŠāļģāļŦāļĢāļąāļšāļ—āļļāļ process

āļ”āđ‰āļēāļ™ Memory:

  • āļāļģāļŦāļ™āļ” --max-old-space-size āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļš RAM āļ—āļĩāđˆāļĄāļĩ
  • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ heap monitoring āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļš memory leaks
  • āđƒāļŠāđ‰ streaming āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ

āļ”āđ‰āļēāļ™ Observability:

  • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ OpenTelemetry āļŦāļĢāļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ APM āļ—āļĩāđˆāđ€āļ—āļĩāļĒāļšāđ€āļ—āđˆāļē
  • āļ•āļąāđ‰āļ‡āļ„āđˆāļē distributed tracing āļŠāļģāļŦāļĢāļąāļš microservices
  • āļŠāļĢāđ‰āļēāļ‡ dashboard āļŠāļģāļŦāļĢāļąāļš key metrics: response time, throughput, error rate, event loop lag

āļ”āđ‰āļēāļ™ Security āđāļĨāļ° Reliability:

  • āļˆāļģāļāļąāļ”āļ‚āļ™āļēāļ” request body āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ DoS
  • āđƒāļŠāđ‰ rate limiting āļŠāļģāļŦāļĢāļąāļš API endpoints
  • āļ•āļąāđ‰āļ‡āļ„āđˆāļē health check endpoint āļŠāļģāļŦāļĢāļąāļš load balancer

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āļŠāļĢāļļāļ›

āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž Node.js āđ„āļĄāđˆāđƒāļŠāđˆāđ€āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āļ™āļīāļ„āđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļœāļŠāļĄāļœāļŠāļēāļ™āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļŦāļĨāļēāļĒāļĢāļ°āļ”āļąāļš āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļĨāđ„āļ Event Loop āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŦāļąāļ§āđƒāļˆāļ‚āļ­āļ‡āļĢāļ°āļšāļš āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ CPU-bound tasks āļ”āđ‰āļ§āļĒ Worker Threads āđāļĨāļ°āļāļēāļĢ scale āļ”āđ‰āļ§āļĒ Clustering āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāļ§āļąāļ”āļœāļĨāļāđˆāļ­āļ™āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡ āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ monitoring āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļ bottleneck āļ—āļĩāđˆāđāļ—āđ‰āļˆāļĢāļīāļ‡ āđāļĨāđ‰āļ§āļˆāļķāļ‡āđ€āļĨāļ·āļ­āļāđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđƒāļ™āļāļēāļĢāđāļāđ‰āđ„āļ‚

āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĻāļķāļāļĐāļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Node.js āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ„āļ”āđ‰āļ—āļĩāđˆ Node.js & NestJS technology track āļ‹āļķāđˆāļ‡āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āļŦāļąāļ§āļ‚āđ‰āļ­ middleware and interceptors module āļˆāļ°āļŠāđˆāļ§āļĒāđ€āļŠāļĢāļīāļĄāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš request pipeline āļŠāđˆāļ§āļ™ Node.js backend interview questions guide āļĢāļ§āļšāļĢāļ§āļĄāļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļžāļĢāđ‰āļ­āļĄāđāļ™āļ§āļ—āļēāļ‡āļ•āļ­āļšāļ­āļĒāđˆāļēāļ‡āļĨāļ°āđ€āļ­āļĩāļĒāļ”

āđāļ—āđ‡āļ

#node.js
#performance
#event-loop
#clustering
#optimization
#worker-threads

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

NestJS āđāļĨāļ° Prisma āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāđāļ•āļāđāļšāđ‡āļāđ€āļ­āļ™āļ”āđŒāļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ

NestJS + Prisma: āļŠāđāļ•āļāđāļšāđ‡āļāđ€āļ­āļ™āļ”āđŒāļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆāļŠāļģāļŦāļĢāļąāļš Node.js

āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ API āđāļšāđ‡āļāđ€āļ­āļ™āļ”āđŒāļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ NestJS āđāļĨāļ° Prisma āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē āđ‚āļĄāđ€āļ”āļĨ āđ€āļ‹āļ­āļĢāđŒāļ§āļīāļŠ āļ—āļĢāļēāļ™āđāļ‹āļāļŠāļąāļ™ āđāļĨāļ°āđāļ™āļ§āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩ

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Backend Node.js - āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Backend Node.js: āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ 2026

25 āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Backend Node.js āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” Event loop, async/await, streams, clustering āđāļĨāļ°āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ­āļ˜āļīāļšāļēāļĒāļžāļĢāđ‰āļ­āļĄāļ„āļģāļ•āļ­āļšāđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”

āļ„āļđāđˆāļĄāļ·āļ­ NestJS āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ REST API āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒ

NestJS: āļŠāļĢāđ‰āļēāļ‡ REST API āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™

āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ REST API āļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļžāļ”āđ‰āļ§āļĒ NestJS āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Controller, Service, Module, āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ class-validator āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”