آشنایی کامل با ماژول Cluster در Node.js و نحوه افزایش مقیاس‌پذیری سرور

ماژول Cluster در Node.js به توسعه‌دهندگان اجازه می‌دهد چندین پردازش همزمان ایجاد کنند که یک پورت سرور را به اشتراک می‌گذارند. این کار باعث استفاده بهتر از هسته‌های CPU و افزایش توان پردازش برنامه می‌شود. در این مقاله نحوه کار Cluster، مدیریت Workerها، تنظیمات مهم و مثال عملی را بررسی می‌کنیم.

cluster.isPrimary / cluster.isWorkercluster.fork()Worker class

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۲۲ بهمن ۱۴۰۴

1. ماژول Cluster در Node.js چیست؟


ماژول Cluster به توسعه‌دهندگان اجازه می‌دهد چندین پردازش Node.js را اجرا کنند که همگی یک پورت سرور را به اشتراک می‌گذارند. این قابلیت باعث افزایش کارایی و استفاده بهتر از چند هسته‌ای بودن پردازنده می‌شود.


2. نحوه کار Cluster


در Cluster یک پردازش اصلی (Primary) و چند پردازش فرعی (Worker) وجود دارد.


  • Workerها با استفاده از child_process.fork() ایجاد می‌شوند.
  • ارتباط بین پردازش اصلی و Workerها از طریق IPC انجام می‌شود.

روش‌های توزیع درخواست

  • Round-robin (پیش‌فرض): پردازش اصلی درخواست‌ها را دریافت کرده و بین Workerها توزیع می‌کند.
  • Direct accept: پردازش اصلی سوکت را ایجاد کرده و آن را به Workerها می‌دهد تا خودشان اتصال را بپذیرند.

3. مثال ساده از Cluster


const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();

if (cluster.isPrimary) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\\n');
  }).listen(8000);
}

در این مثال، به تعداد هسته‌های CPU، پردازش Worker ساخته می‌شود و همه آن‌ها یک سرور مشترک را اجرا می‌کنند.


4. کلاس Worker


هر Worker در Cluster با یک شیء Worker نمایش داده می‌شود که از EventEmitter ارث‌بری می‌کند.


رویدادهای مهم Worker

  • disconnect : قطع شدن کانال ارتباطی
  • error : بروز خطا در Worker
  • exit : پایان اجرای Worker
  • listening : آماده بودن برای دریافت درخواست
  • message : دریافت پیام از Worker
  • online : فعال شدن Worker پس از fork

5. مدیریت Workerها


برای کنترل Workerها می‌توان از متدهای زیر استفاده کرد:


  • worker.disconnect() : قطع ارتباط به صورت امن
  • worker.exitedAfterDisconnect : تشخیص خروج عادی یا خطا
  • worker.isConnected() و worker.isDead() : بررسی وضعیت Worker
  • worker.kill() : پایان فوری Worker

6. تنظیمات Cluster


شیء cluster.settings شامل تنظیماتی مانند موارد زیر است:


  • execArgv
  • exec
  • args
  • cwd
  • serialization
  • silent
  • stdio
  • uid و gid
  • inspectPort
  • windowsHide

همچنین می‌توان با استفاده از cluster.setupPrimary() رفتار پیش‌فرض fork را تنظیم کرد و با cluster.schedulingPolicy نوع زمان‌بندی را مشخص نمود.


7. نکات مهم


  • ماژول Node.js Cluster مسیریابی یا مدیریت Session را انجام نمی‌دهد، بنابراین نباید Sessionها فقط در حافظه Worker ذخیره شوند.
  • Workerها می‌توانند بدون تأثیر روی سایر Workerها متوقف یا مجدداً اجرا شوند.
  • مدیریت تعداد Workerها بر عهده برنامه‌نویس است.

نتیجه‌گیری


ماژول Cluster یکی از ابزارهای قدرتمند برای افزایش مقیاس‌پذیری در Node.js است. با توزیع بار بین چند پردازش و استفاده از ارتباط IPC می‌توان سیستم‌هایی سریع‌تر و پایدارتر ساخت. مدیریت صحیح Workerها و طراحی مناسب معماری نقش مهمی در موفقیت این روش دارد.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

راهنمای جامع ماژول VM در Node.js (ماژول node:vm)

ماژول node:vm امکان کامپایل و اجرای کد جاوااسکریپت در کانتکست‌های ایزولهٔ V8 را فراهم می‌کند. این کانتکست‌ها مانند یک «سندباکس سبک» داخل برنامهٔ Node.js عمل می‌کنند و هرکدام globalThis مخصوص خود را دارند. این ماژول برای اجرای پویا، موتورهای قالب (Template Engines)، سیستم‌های افزونه (Plugin Systems)، REPLها و تست ایزولهٔ منطق بسیار مناسب است. اما نکتهٔ بسیار مهم: vm یک ابزار امنیتی نیست و نباید برای اجرای کدهای غیرقابل‌اعتماد استفاده شود.

ادامه

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

ادامه

راهنمای جامع Worker Threads در Node.js (ماژول node:worker_threads)

ماژول node:worker_threads امکان اجرای واقعی چندریسمانی (Multithreading) را در Node.js فراهم می‌کند. برخلاف مدل تک‌ریسمانی سنتی Node.js، Worker Threads اجازه می‌دهند کارهای سنگین CPU در ریسه‌های جداگانه اجرا شوند بدون اینکه حلقهٔ رویداد (Event Loop) مسدود شود. این ماژول از حافظهٔ اشتراکی، انتقال بدون کپی (Zero‑Copy)، کانال‌های پیام، Worker Pool، محدودیت منابع و ابزارهای همگام‌سازی پیشرفته پشتیبانی می‌کند. Worker Threads برای پردازش‌های محاسباتی سنگین ایده‌آل هستند، در حالی که I/O همچنان باید توسط ریسهٔ اصلی مدیریت شود.

ادامه

راهنمای جامع ماژول util در Node.js

ماژول node:util مجموعه‌ای از توابع کمکی قدرتمند برای استفاده در هستهٔ Node.js و همچنین توسعهٔ برنامه‌ها ارائه می‌دهد. این ماژول ابزارهایی برای دیباگ، بازرسی اشیا، تبدیل Callback ↔ Promise، قالب‌بندی رشته‌ها، بررسی انواع، مدیریت خطاها، رمزگذاری متن، پردازش MIME، پارس آرگومان‌های CLI، سیگنال‌های Abort، و ابزارهای متفرقه فراهم می‌کند. این ماژول یکی از جعبه‌ابزارهای اصلی و ضروری برای توسعه‌دهندگان Node.js است.

ادامه

راهنمای جامع ماژول URL در Node.js

ماژول node:url ابزارهایی برای تحلیل، ساخت، و دست‌کاری URLها در Node.js فراهم می‌کند. Node.js دو API برای کار با URL دارد: WHATWG URL API — استاندارد مدرن و سازگار با مرورگرها (توصیه‌شده). Legacy API — API قدیمی Node.js (غیرتوصیه‌شده). WHATWG URL API یک رابط تمیز، سازگار و قدرتمند برای کار با اجزای URL، پارامترهای query، الگوهای URL و حتی Blob URLها ارائه می‌دهد.

ادامه

Comprehensive Guide to UDP/Datagram Sockets in Node.js

The node:dgram module provides a full implementation of UDP (User Datagram Protocol) sockets in Node.js. . UDP is a lightweight, connectionless protocol ideal for real‑time applications such as VoIP, gaming, telemetry, IoT, and multicast/broadcast systems. This module exposes APIs for creating sockets, sending and receiving datagrams, joining multicast groups, managing buffer sizes, and controlling low‑level socket behavior.

ادامه