Node.js
Node.js یا به اختصار نود ، نسخه مفسر تحت سرور جاوا اسکریپت است که تصور کلی و قدیمیه ، ما که یک سرور چگونه کار میکند را کاملا تغییر میدهد.هدف نود ، بر این است که یک برنامه نویس بتواند نرم افزاری با مقایس های متفاوت(از نرم افزار های کوچک تا بسیار بزرگ) بسازد و کدی بنویسد که بتواند هزاران اتصال کاربر (Client)را بر روی یک و تنها یک (Machine) مدیرت کند.
این پلتفرم در ابتدا توسط رایان داهل (Ryan Dahl) در سال 2009 نوشته شد و رشد و توسعه آن مرهون پشتیبانی Joynet، شرکت متبوع رایان داهل است. این پلتفرم با استفاده از زبان C و همچنین خود جاوااسکریپت نوشتهشده و حاوی موتور جاوااسکریپت V8 گوگل کروم و سیستم ماجولی Common JS به همراه برخی دیگر از کتابخانههای دیگر است و برخلاف آنچه تاکنون مرسوم بود، نه روی مرورگر که در سمت سرور اجرا میشود. با استفاده از این پلتفرم، به سادگی میتوان وب سرورهای همزمان (Concurrent) بسیاری ایجاد کرد تا عملیات ورودی و خروجی را به روشی پر بازده (که با نام روش non-blocking شناخته میشود) مدیریت کرد. چنین امکاناتی برای TCP، DNS و HTTP در این پلتفرم درنظر گرفتهشده است. این پلتفرم به طور کامل حاوی API جاوااسکریپت بوده و همچنین، بخشهای اضافهای را نیز برای انجام عملیاتهایی مانند کار با سیستمفایلی ارائه میکند. توجه داشته باشید که Node.js باید بهصورت جدا دانلود شده و پس از کامپایل در سرور مورد نظر، برای اجرای کدهای جاوااسکریپت مورد استفاده قرار گیرد
چرا نود قابل احترام است و برای چه نود را به تکنولوژی های دیگر ترجیح بدهیم؟
فرض را بر این میگذاریم که کامپیوتر به عنوان سرور با 8 گیگابایت RAM داریم، در زبانی مثل Java یا PHP هر اتصال (Connection) یک نخ (Thread) جدید در سرور به وجود می آورد ، که هر نخ 2 مگابایت از حافظه را به خود اختصاص میدهد.بر روی سیستمی که 8 گیگابایت حافظه رم دارد ، به طور (تئوری،روی کاغذ) ماکزیمم اتصال های همزمان ، 4000 کاربر می باشد.
زمانیکه تعداد کاربر های وب سایت شما افزایش یافت ، یعنی اتصال های بیشتری نیاز بود ، باید تعداد سرور ها رو بیشتر کنید ، یعنی هزینه ها بالا و بالاتر میرود ، پهنای باند بیشتر ، کارمند بیشتر و ...علاوه بر هزینه ها ، کاربر ممکن است از سرور های گوناگون دادها را دریافت کند ، در نتیجه ، نیاز داریم که منابع را روی سرورهای دیگر به اشتراک قرار دهیم ...
به هر حال ، در تمام نرم افزار های تحت وب ، مهمترین نگرانی تعداد اتصال های همزمانی است که سرور قادر به پاسخگویی به آن ها است.
نود این مشکل را با تغییر نحوه اتصال به سرور حل کرده است.در واقع در نود ، در عوض ایجاد یک نخ جدید برای هر اتصال (و در اختیار قرار دادن حافظه رم به آن) ، هر اتصال رویدادی رو درون موتور پردازه های نود ، فراخوانی میکند.همچنین نود مدعی است که هیچوقت به بن بست (DeadLock) بر نمیخورد ، از آنجا که اجازه لاک شدن (یعنی منتظر ماندن برای دریافت نتایج درخواست) را به برنامه نویس (به درخواست ورودی) نداده است ، همچنین بصورت مستقیم برای درخواست های ورودی/خروجی (I/O) مسدود نمیشود.
همچنین نود ادعا کرده است ، سروری که نود بر روی آن راه اندازی شده ، از هزاران اتصال همزمان پشتیبانی میکند.
به هر حال ، برای نرم افزار های ساده با تعداد کاربر کم پیشنهاد نمیشود ، ولی برای برنامه هایی که بسیار پر هزینه از نظر اتصالات کاربران هستن (مثل پیام رسان یاهو) این تکنولوژی فوق العادس ...
مزایا
- مقیاسپذیر به هزاران اتصال فعال
- بسیار سریع (به خصوص در مقایسه با PHP و Ruby)
- امنیت بیشتر در مقابل بار اضافی اعمال شده به سرور (به خصوص در زمان وقوع حملههای DDOS که بقیه نرمافزارهای سرور مانند SSH قابل دسترسی و پاسخ دهنده باقی میمانند)
- پارادایم ناهمزمان بسیار ساده، جذاب و آشنا
- نیاز نداشتن به درگیری با مسائلی مانند thread-safety
- عدم استفاده از Multithreading و به تبع آن، مواجه نشدن با باگهای قفلکننده
- جامعه توسعهدهندگان بسیار عظیم و کتابخانهها و ابزارهای توسعهداده شده غنی به همراه یک Package Manager قوی برای مدیریت ملحقات!
معایب
- پیچیدگی کد برنامه ناهمزمان (Asyncronous) و مشکل بودن یادگیری مفاهیم اولیه برای برنامهنویسان ناآشنا با مدل برنامهنویسی موازی.
- تأخیر بسیار بالا در صورت نیاز وظایف داخلی به اتمام عملیات محوله. به دلیل اینکه برنامه بهصورت تک رشتهای اجرا میشود، یک تابع با زمان اجرای طولانی میتواند سرعت پاسخدهی کلی سیستم را به شدت کاهش دهد.
- نبود یک کتابخانه استاندارد جاوااسکریپت. برنامهنویسان جاوااسکریپت به شدت به استفاده آسان از آن عادت کردهاند، بدون اینکه به وارد کردن کتابخانه خاصی نیاز داشته باشند. بههمین دلیل، از هر چیزی در برنامهها پنج مدل مختلف وجود خواهد داشت که سردرگمی خاصی را ایجاد میکند. حتی ماجولهای قرارداده شده در هسته Node.js نیز هر کدام پنج نوع مختلف دارند که به تکامل سریعتر میانجامد، اما درجه ابهام بالایی را نیز در پیخواهد داشت.
- سیستمهای نهایی نوشتهشده با این فناوری بهشدت نسبت به مدل CGI، یعنی Apache+PHP یا Perl یا Ruby و... پیچیدهتر بوده و استثناهای مدیریتنشده میتوانند کل فرآیند را متوقفکرده و نیاز به راهاندازی دوباره فرآیندهای درحال کار روی کلاستر را الزامی سازند. یک کد باگ دار نیز میتواند باعث خرابی فرآیند اجرایی مربوط شده و هر فرآیند درحال کار خراب، درخواستهای بسیاری را بیپاسخ خواهدگذاشت که به تبع آن مقاومت کل سیستم در مقابل خرابی را کاهش داده و باعث کاهش کیفیت خدمات خواهد شد.