به طور معمول، سرور 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 در اختیار داریم که به شرح زیر هستند:
همان طور که در ادامه مشاهده میکنید، متدهای ماژول cluster به دو قسمت کلی تقسیم میشوند:
Worker:
این متدها مخصوص worker processes هستند و اسامی آنها به شرح زیر است:
()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 استفاده میشود.
cluster
: چند نمونه از متدهای مخصوص پردازش master در زیر آوردهام:
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) که هنگام کار با پردازشهای فرزند (دقت نمایید که این پردازشهای فرزند در واقع همان پردازش های worker هستند که توسط پردازش master به وجود می آیند) پیش خواهند آمد، عبارتاند از:
Worker
: پردازشهای worker میتوانند رویدادهای زیر را به وجود آورند:disconnect
،error
، exit
،listening
، message
و online
Cluster
میتوانند رویدادهای زیر را به وجود آورند:disconnect
، exit
، fork
، listening
، message
، online
و setup
در درس 25ام از سلسله دروس 30 روز با نود جی اس، ما یاد گرفتیم که cluster چیست و چگونه میتوان آن را کد نویسی کرد. در ادامه نیز با انواع event ها و متدهای موجود در ماژول cluster آشنا شدیم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.