۳۰ روز با Node – روز بیست و پنجم: ماژول خوشه بندی Cluster در نود جی اس

07 بهمن 1397
Nodejs-clusters

خوشه ها Clusters

به طور معمول، سرور node.js بر روی یک پورت اجرا می‌شود و فقط از سیستم‌ عامل تک هسته‌ ای استفاده می‌کند که باعث کاهش قدرت استفاده از قابلیت‌های سخت‌ افزاری سیستم می‌شود؛ بنابراین برای اینکه ما بتوانیم به طور کامل از قابلیت‌های سیستم ­های چند هسته‌ایی استفاده کنیم، باید ماژول خوشه‌ cluster را روی پردازش های node.js راه‌ اندازی کنیم. این فرآیند clustering (خوشه‌بندی) خوانده می‌شود.

خوشه‌بندی در node.js به ما این اجازه را می­دهد که پردازش های متفاوتی را ایجاد کنیم که این پردازش ها می‌توانند منابعی همانند پورت سرور را به اشتراک بگذارند. بهتر است بگوییم یکی از بهترین راه حل های موجود استفاده از ماژول cluster است.

cluster به معنی خوشه است و با آن شما میتوانید برنامه نوشته شده ی خود را به یک Master Process و چندین Worker Process به صورت خوشه ای تقسیم و سپس اجرا کنید تا از تمام ظرفیت CPU استفاده شود.

ما می‌توانیم به آسانی از ماژول cluster، مانند کد زیر بهره بگیریم و قابلیت ­های آن را مورد استفاده قرار دهیم.

var cluster = require('cluster');

چگونه این کار انجام می‌شود؟

اجازه دهید که درک موضوع خوشه‌ بندی را با کمک یک مثال ساده کد نویسی خدمت شما ارائه دهم.

//Name of the file : cluster.js
var cluster = require('cluster');
var http = require('http');
var numofCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master with Process ID : ${process.pid} is running`);

  // Fork workers.
  for (var i = 0; i < numofCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker with Process ID : ${worker.process.pid} died`);
  });
} else {
  // Workers sharing an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('An example of clusters\n');
  }).listen(3000);
  console.log(`Worker with Process ID : ${process.pid} started`);

}

ما می‌ توانیم این مثال را به روش زیر اجرا کنیم.

خوشه بندی

توزیع کردن اتصالات ورودی در خوشه‌ ها

ما دو رویکرد خاص را برای توزیع کردن اتصالات ورودی در ماژول cluster مربوط به node.js در اختیار داریم که به شرح زیر هستند:

  1. استفاده از رویکرد Round-robin: در این رویکرد، پردازش اصلی (master process) به پورت گوش داده و ارتباط جدید را قبول می‌کند و با استفاده از مدل round-robin آن‌ها را بین پردازش­های workers توزیع می­کند. این رویکرد همچنین دارای برخی الگوریتم‌های هوشمند است که از overhead بیش از حد بر روی یک پردازش خاص جلوگیری می‌کنند. این رویکرد به صورت پیش‌فرض در همه‌ی سیستم‌ عامل‌ها به جز ویندوز وجود دارد.
  2. استفاده از سوکت‌ها: در این رویکرد ، پردازش اصلی (master process) با استفاده از سوکت‌ها به پورت گوش می‌دهد و ارتباط ورودی را به پردازش worker مورد نظر خودش ارسال می‌کند. و سپس آن پردازش worker، ارتباط را به صورت مستقیم در اختیار می‌گیرد.

متدهای ماژول cluster

همان طور که در ادامه مشاهده می‌کنید، متدهای ماژول cluster به دو قسمت کلی تقسیم می‌شوند:

  1. Worker: این متدها مخصوص worker processes هستند و اسامی آنها به شرح زیر است:
    • ()worker.disconnect: این متد برای بستن تمام سرورها مورد استفاده قرار می‌گیرد، همچنین منتظر می‌ماند تا رویدادهای (events) مربوط به آن سرور را نیز ببندد و سپس کانال IPC بین کارگرها را قطع می‌کند. برای درک IPC به قسمت "۳۰ روز با Node – روز بیست و چهارم: فرایندهای فرزند child process در نود جی اس" رجوع کنید.worker.exitedAfterDisconnect: این متد یک مقدار Boolean را به عنوان نتیجه بر می‌گرداند. مقدار خروجی این متد هم با فراخوانی ()kill. و ()disconnect. تعیین می‌شود. قبل از آن، مقدار undefined است. این متد برای تشخیص بین خروج داوطلبانه و خروج تصادفی پردازش worker، مورد استفاده قرار می‌گیرد. اگر مقدار برگشتی  exitedAfterDisconnect. برابر با true باشد یعنی اینکه خروج داوطلبانه بوده است.

      worker.id: هر پردازش worker برای خودش id منحصر به فردی دارد. وظیفه تابع worker.id این است که id پردازش­های worker را در کنسول چاپ کند.

      ()worker.isConnected: اگر میان پردازش worker و پردازش master ارتباط از طریق کانال IPC برقرار باشد، تابع worker.isConnected مقدار true را بازمی‌گرداند در غیر این صورت false را بازگشت خواهد داد.

      ()worker.isDead: این متد به پردازش worker دقت می‌کند، اگر این پردازش خاتمه یافت (کارش به پایان رسید) و یا اینکه از بین رفت، مقدار true را بازگشت می‌دهد در غیر این صورت مقدار false را بر می‌گرداند.

      ()worker.kill: این متد برای از بین بردن یک پردازش worker مورد استفاده قرار می‌گیرد.

      worker.process: این متد، همه پردازش های worker ایجاد شده را بر می گرداند.

      ()worker.send: از این متد برای ارسال پیام به یک پردازش master یا پردازش worker استفاده می‌شود.

  2. cluster: چند نمونه از متدهای مخصوص پردازش master در زیر آورده‌ام:
    • ()cluster.disconnect: این متد برای از بین بردن پردازش­های worker استفاده می‌شود.()cluster.fork: با استفاده از این متد پردازش­های worker جدیدی می‌توان ایجاد کرد.

      cluster.isMaster: با استفاده از این متد می‌توان متوجه شد آیا پردازش مورد نظر، پردازش master است یا خیر. اگر پردازش مورد نظر، master باشد، مقدار true توسط این متد برگشت داده خواهد شد در غیر این صورت متد مقدار false را برمی‌گرداند.

      cluster.isWorker: با استفاده از این متد می‌توان متوجه شد آیا پردازش مورد نظر، پردازش worker است یا خیر. اگر پردازش مورد نظر، worker باشد، مقدار true توسط این متد برگشت داده خواهد شد در غیر این صورت متد مقدار false را برمی‌گرداند.

      cluster.schedulingPolicy: کار این متد تنظیم کردن سیاست برنامه‌ریزی پردازش­ها است. به صورت پیش‌فرض، به جز در مورد سیستم‌عامل ویندوز، سیاست برنامه‌ریزی پردازش­ها از مدل round robin تبعیت می‌کند.

      cluster.settings: این متد برای ما یک شی (object) بازمی‌گرداند که شامل تمامی تنظیمات مرتبط با ماژول cluster است.

      ()cluster.setupMaster: این متد برای تغییر تنظیمات پیش‌فرض پردازش master مورد استفاده قرار می‌گیرد، همان طور که دید می‌توان با استفاده از روش cluster.settings آن‌ها را تنظیم کرد.

      cluster.worker: این متد اشاره ه­ایی به شی پردازش worker دارد. دقت نمایید که این متد در پردازش master در دسترس نیست.

رویدادهای (Events) ماژول cluster

رویدادهایی (Events) که هنگام کار با پردازش­های فرزند (دقت نمایید که این پردازشهای فرزند در واقع همان پردازش های worker هستند که توسط پردازش master به وجود می آیند) پیش خواهند آمد، عبارت‌اند از:

  • Worker : پردازش­های worker می‌توانند رویدادهای زیر را به وجود آورند:disconnect ،error، exit ،listening،  message و online
  • Cluster  : Cluster می‌توانند رویدادهای زیر را به وجود آورند:disconnect، exit، fork، listening، message، online و setup

خلاصه

در درس 25ام از سلسله دروس 30 روز با نود جی اس، ما یاد گرفتیم که cluster چیست و چگونه می‌توان آن را کد نویسی کرد. در ادامه نیز با انواع event ها و متدهای موجود در ماژول cluster آشنا شدیم.

نویسنده شوید
دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
09 بهمن 1397
سلام به شما دوست عزیز، به نظرم، شما به عنوان یک برنامه نویس وب ، باید سعی کنید بر روی هر چیزی که در برنامه نویسی وب موثر است ، تسلط نسبی داشته باشید، مخصوصا JAVASCRIPT. برای اینکه بهتر راهنمایی بشید، بهتر هست به آدرس زیر مراجعه کنید و فصل 1 و 2 که رایگان هم هست رو مشاهده کنید https://www.roxo.ir/home/videos/zero-to-hero-nodejs

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Ahmad Tavakoli
09 بهمن 1397
سلام... من خیلی جاوا اسکریپ و اینا بلد نیستم و دارم پی اچ پی کار یاد میگیرم. سوالم اینه که یادگرفتن نود جی اس از پی اچ پی سخت تره یا شبیه همونه؟ میشه راهنمایی کنی ؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.