خوشه ها 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 در اختیار داریم که به شرح زیر هستند:
- استفاده از رویکرد Round-robin: در این رویکرد، پردازش اصلی (master process) به پورت گوش داده و ارتباط جدید را قبول میکند و با استفاده از مدل round-robin آنها را بین پردازشهای workers توزیع میکند. این رویکرد همچنین دارای برخی الگوریتمهای هوشمند است که از overhead بیش از حد بر روی یک پردازش خاص جلوگیری میکنند. این رویکرد به صورت پیشفرض در همهی سیستم عاملها به جز ویندوز وجود دارد.
- استفاده از سوکتها: در این رویکرد ، پردازش اصلی (master process) با استفاده از سوکتها به پورت گوش میدهد و ارتباط ورودی را به پردازش worker مورد نظر خودش ارسال میکند. و سپس آن پردازش worker، ارتباط را به صورت مستقیم در اختیار میگیرد.
متدهای ماژول cluster
همان طور که در ادامه مشاهده میکنید، متدهای ماژول cluster به دو قسمت کلی تقسیم میشوند:
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 استفاده میشود.
- ()worker.disconnect: این متد برای بستن تمام سرورها مورد استفاده قرار میگیرد، همچنین منتظر میماند تا رویدادهای (events) مربوط به آن سرور را نیز ببندد و سپس کانال IPC بین کارگرها را قطع میکند. برای درک IPC به قسمت “۳۰ روز با Node – روز بیست و چهارم: فرایندهای فرزند child process در نود جی اس” رجوع کنید.worker.exitedAfterDisconnect: این متد یک مقدار Boolean را به عنوان نتیجه بر میگرداند. مقدار خروجی این متد هم با فراخوانی
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 در دسترس نیست.
- ()cluster.disconnect: این متد برای از بین بردن پردازشهای worker استفاده میشود.()cluster.fork: با استفاده از این متد پردازشهای worker جدیدی میتوان ایجاد کرد.
رویدادهای (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 آشنا شدیم.