Fork me on GitHub

استفاده از تمام ظرفیت CPU با Clustering

معماری Nodejs به صورت Single-Threaded است، یعنی تک-رشته ای. اگر بخواهیم این رشته یا همان Thread) را مختصرا تعریف کنیم، میتوان گفت Thread به بخشی از یک Process گفته میشود که به منابع آن Process دسترسی دارد. ضمنا هر Process میتواند Thread های مختلفی داشته باشد. اما همانطور که گفتیم ما در Nodejs تنها یک Thread داریم که مسئول اجرای برنامه نوشته شده با Nodejs می‌باشد. این تک-رشته‌ای بودن در Nodejs محاسن بسیاری دارد که در این مقاله به آنها نمیپردازیم و به جای آن تلاش میکنیم به این سوال مهم پاسخ دهیم که: اگر CPU سرور ما چندین هسته داشته باشد، تک-رشته ای بودن Nodejs باعث میشود تنها از یک هسته ی آن استفاده شود! پس راه حل چیست؟

معرفی forever

فرض کنید برنامه ای با node نوشته‌اید و آن را به سرور خود منتقل کرده و از طریق ssh با دستور node myscript.js آن را اجرا کرده‌اید. بعد از چند دقیقه برنامه شما از کار می‌افتد در صورتی که مطمئن هستید خطایی در آن نیست. این مشکل اول!

وقتی که به زبان PHP یا Ruby یا زبان‌هایی از این دست برنامه‌ای می نویسیم، برای اجرای آن از وب سرورهایی نظیر apache یا nginx استفاده می کنیم: با هر درخواست، وب سرور اسکریپت برنامه را اجرا می کند و پاسخ را به کاربر می فرستد. اما در node برنامه ها مستقل عمل می کنند. به عنوان مثال وقتی در node از ماژول http استفاده می کنیم هیچ نیازی به وب سرور نداریم. حال فرض کنید برنامه در حال پاسخ به یک درخواست به خطای شکار نشده ( یعنی همون catch نشده :دی ) برخورد کند.

در حالتی که از وب سرورها برای اجرای اسکریپتها استفاده می‌شود ( مثل PHP ) تنها کاربری که با خطا مواجه می‌شود آن کسی است که درخواست را ارسال نموده و دیگر کاربران چون به این حالت خطا نرسیده اند بدون مشکل با برنامه در تعامل خواهند بود. اما در حالتی که از node استفاده کنیم بروز یک خطای catch نشده کل process را از کار می اندازد و به عبارتی برنامه crash می کند. بنابراین تا زمانی که برنامه دوباره راه اندازی نشود کسی قادر به استفاده از آن نیست. این هم مشکل دوم!