Node.js Performance: Event Loop, Clustering āđāļĨāļ° Optimization āļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ 2026
āļāļđāđāļĄāļ·āļāđāļāļīāļāļĨāļķāļāđāļāļĩāđāļĒāļ§āļāļąāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ Node.js āļāļĢāļāļāļāļĨāļļāļĄāļāļĨāđāļ Event Loop, āļāļēāļĢāļāļģ Clustering, Worker Threads, āļāļēāļĢāļāļąāļāļāļēāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āđāļĨāļ°āđāļāļāļāļīāļ Optimization āļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļ production āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāļāļĢāļīāļāļāļĩāđāļāļģāđāļāđāļāđāđāļāđāļāļąāļāļāļĩ

āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļāļ 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
// 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 āļĄāļĩāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļŠāļģāļŦāļĢāļąāļāļāļĢāļ§āļāļ§āļąāļāļāđāļēāđāļŦāļĨāđāļēāļāļĩāđ
// 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 āđāļĨāļ°āļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļĄāļđāļĨāđāļāļĨāļđāļāļāļāļēāļāđāļŦāļāđ
// 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
// 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 āđāļŦāļĄāđāļāļļāļāļāļĢāļąāđāļ
// 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
// 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 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 āļāļāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļŠāļđāļāļāļķāđāļ
// 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 āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāļāļąāļāļāļĩāđ
// 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 (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 āļĢāļ§āļāļĢāļ§āļĄāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļāļāļāđāļāļĒāļāļĢāđāļāļĄāđāļāļ§āļāļēāļāļāļāļāļāļĒāđāļēāļāļĨāļ°āđāļāļĩāļĒāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

NestJS + Prisma: āļŠāđāļāļāđāļāđāļāđāļāļāļāđāļŠāļĄāļąāļĒāđāļŦāļĄāđāļŠāļģāļŦāļĢāļąāļ Node.js
āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāđāļāļāļēāļĢāļŠāļĢāđāļēāļ API āđāļāđāļāđāļāļāļāđāļŠāļĄāļąāļĒāđāļŦāļĄāđāļāđāļ§āļĒ NestJS āđāļĨāļ° Prisma āļāļĢāļāļāļāļĨāļļāļĄāļāļēāļĢāļāļąāđāļāļāđāļē āđāļĄāđāļāļĨ āđāļāļāļĢāđāļ§āļīāļŠ āļāļĢāļēāļāđāļāļāļāļąāļ āđāļĨāļ°āđāļāļ§āļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩ

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Backend Node.js: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ 2026
25 āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Backend Node.js āļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļ Event loop, async/await, streams, clustering āđāļĨāļ°āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļāļīāļāļēāļĒāļāļĢāđāļāļĄāļāļģāļāļāļāđāļāļĒāļĨāļ°āđāļāļĩāļĒāļ

NestJS: āļŠāļĢāđāļēāļ REST API āļāļĩāđāļŠāļĄāļāļđāļĢāļāđāļāļąāđāļāđāļāđāđāļĢāļīāđāļĄāļāđāļ
āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļĢāđāļēāļ REST API āļĢāļ°āļāļąāļāļĄāļ·āļāļāļēāļāļĩāļāļāđāļ§āļĒ NestJS āļāļĢāļāļāļāļĨāļļāļĄ Controller, Service, Module, āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļāļĄāļđāļĨāļāđāļ§āļĒ class-validator āđāļĨāļ°āļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļāļīāļāļāļĨāļēāļ