Node.js یک گام بزرگ به عقب
هر چند وقت یکبار، فناوریهای جدیدی ظاهر میشوند که شما را به شدت تحتتأثیر قرار میدهند. در این مواقع معمولاً فکر میکنید چنین چیزی باید زودتر معرفی میشد و حال که معرفی شده، گامی مهم و سرآغاز تحولاتی شگرف خواهد بود. آخرین باری که این اتفاق برای من افتاد، زمانی بود که درباره پروژهای بهنام Node.JS یا Node (همانطور که باینری آن با این نام خوانده میشود) کنجکاوی کردم و به کسب اطلاعات پرداختم. اگر یک توسعهدهنده وب هستید و بهویژه اگر با جاوا اسکریپت سروکار دارید، باید نود را بهشدت جدی گرفته و اخبار توسعه آن را پیگیری کنید.
با اینکه کمتر از دو سال از معرفی این پلتفرم میگذرد، توجه بسیاری از کاربران را به خود جلب کرده و ابزارهای بسیاری براساس آن یا برای آن توسعه داده شده است. پلتفرم نود، یک گام بسیار بزرگ و تأثیرگذار به عقب (زمانی که نت اسکیپ به معرفی جاوا اسکریپت سمت سرور پرداخت) است که آینده را به شدت متحول خواهد کرد.
Node.js چیست: بازگشت به جاوا اسکریپت نود، یک سیستم نرمافزاری است که برای نوشتن برنامههای اینترنتی (بهخصوص وب سرورهای جدید و پیشرفته) با توجه ویژه به قابلیت مقیاس پذیری بالا توسعهداده شده است. در این پلتفرم، برنامهها با زبان جاوا اسکریپت نوشته میشوند که در آن، با استفاده از سیستم ورودی/خروجی ناهمزمان (Asynchronous) و رویداد محور، سعی در کاهش سربار و افزایش مقیاس پذیری پلتفرم شده است.
این پلتفرم در ابتدا توسط رایان داهل (Ryan Dahl) در سال ۲۰۰۹ نوشته شد و رشد و توسعه آن مرهون پشتیبانی Joynet، شرکت متبوع رایان داهل است. این پلتفرم با استفاده از زبان C و همچنین خود جاوا اسکریپت نوشتهشده و حاوی موتور جاوا اسکریپت V۸ گوگل کروم و سیستم ماجولی Common JS به همراه برخی دیگر از کتابخانههای دیگر است و برخلاف آنچه تاکنون مرسوم بود، نه روی مرورگر که در سمت سرور اجرا میشود.
با استفاده از این پلتفرم، به سادگی میتوان وبسرورهای همزمان (Concurrent) بسیاری ایجاد کرد تا عملیات ورودی و خروجی را به روشی پر بازده (که با نام روش non-blocking شناخته میشود) مدیریت کرد. چنین امکاناتی برای TCP، DNS و HTTP در این پلتفرم درنظر گرفتهشده است. این پلتفرم به طور کامل حاوی API جاوا اسکریپت بوده و همچنین، بخشهای اضافهای را نیز برای انجام عملیاتهایی مانند کار با سیستمفایلی ارائه میکند. توجه داشته باشید که Node.js باید بهصورت جدا دانلود شده و پس از کامپایل در سرور مورد نظر، برای اجرای کدهای جاوااسکریپت مورد استفاده قرار گیرد (شکل۱).
شکل ۱- نمایی از پلتفرم Node.js در حال نصب روی ویندوز چرا پلتفرم نود مهم است؟ با اینکه تاکنون پلتفرمهای مشابهی با زبانهای مختلف در این زمینه معرفی شدهاند، اهمیت Node.js در این است که رایان داهل و همکاران وی با استفاده از جاوا اسکریپت چنین پلتفرم سمت سروری را تولید کردهاند که بیاغراق، مورد استفاده تمام توسعهدهندگان وب تاکنون بوده است زیرا همه آنها برای انجام امور سمت کلاینت باید از جاوا اسکریپت استفاده میکردند و معرفی نود باعث شد تا بسیاری به این فکر بیفتند که دیگر به زبان سمت سرور اختصاصی خود نیاز نداشته و با استفاده از جاوا اسکریپت، بسیاری از دردسرها کاهش خواهد یافت.
از طرف دیگر، پارادایم خاص جاوا اسکریپت برای کار با Callbackها و انجام امور ورودی/خروجی بهصورت non-blocking نیز در توجه توسعهدهندگان و گرایش بسیاری به سمت آن تأثیر بهسزایی داشته است.
برای روشنشدن میزان سودمندی نود، مثالی ذکر میکنیم. تصور کنید در یک سایت اینترنتی، هزاران کاربر با واردکردن URL سایت وارد آن شده و بسیاری دیگر، درخواستهای AJAX بی شماری به وب سرور سایت مذکور ارسال میکنند. در این شرایط، هر درخواست یک رشته یا thread جدید در برنامه وب سرور مورد استفاده (که عموماً آپاچی خواهد بود) ایجاد کرده تا اسکریپتی را، برای نمونه PHP که به احتمال، حاوی پرسوجو از پایگاهداده یا چیزی شبیه به آن است، اجرا کند و نتیجه این اجرا را برای مرورگر درخواستکننده ارسال کند. در این کاربرد دو مفهوم اصلی از اهمیت ویژهای برخوردار هستند: یکی حافظه و دیگری ورودی/خروجی بلوکهکننده. زیرا هر thread اجرایی، حافظه بسیار زیادی را اشغالکرده و تعدد کاربران، امکان پرشدن حافظه سیستم و از کار افتادن خدمات مربوط را پیشمیآورد.
همچنین، هر کدام از این رشتههای پردازشی به عملیات ورودی/خروجی مانند دسترسی به پایگاهداده نیاز دارند که هرکدام به زمانی مشخص برای تکمیلشدن نیازمند است. در بیشتر موارد نیز به دلیل بزرگبودن جدولهای دادهای و نتایج پرسوجوهای انجام شده، اسکریپت اجراکننده مجبور است تا بازگردانی دادهها از طرف پایگاهداده منتظرمانده و پس از دریافت، به اجرای بقیه دستورها بپردازد. به همین دلیل، این عملیات، عملیات ورودی/خروجی بلوکه کننده نامیده میشود و تأثیری بسیار منفی روی عملکرد کلی سرور خواهد داشت. نکته منفی این رویداد علاوه بر انتظار اسکریپت برای بازگردانی دادههای درخواست شده، مصرف توانپردازشی و حافظه درحین انتظار است که در صورتی که در مقیاس بالا اتفاق بیفتد، باعث ناکارآمدی کلی سیستم خواهد شد (شکل۲).
شکل ۲- معماری گذشته وبسرورها حال اگر راهی باشد که بتوان این رشتههای پردازشی را حذف کرده و همه را در یک انباره بزرگ قرار داد، مشکل مصرف حافظه برطرف خواهد شد. همچنین، در صورتی که بتوان تا زمانی که برای بازگردانی نتایج ورودی/خروجی (پرسوجو از پایگاهداده) منتظر هستیم، به انجام امور دیگر در اسکریپت خود بپردازیم مشکل بلوکه شدن نیز حذف شده و سرعت عملکرد به طور قابل توجهی افزایش خواهد یافت. این دو مورد دقیقاً کارهایی است که Node.js به انجام آنها مبادرت ورزیده و به همین دلیل، اهمیت بالایی در آینده برنامههای کاربردی وب خواهد داشت.
یک سرور مبتنی بر Node.js، تمام اتصالهای ورودی را در یک انباره مدیریت کرده و فریمورک پس زمینه نود، میتواند حالات و شرایط این اتصالها را مدیریت کرده و برای نمونه، یک اتصال را به حالت «در حال انتظار» تبدیل کند. همچنین، در پلتفرم نود از پارادیم حلقه رویداد و Callback برای انجام امور پرسوجو از پایگاه داده استفاده شده است تا انتظار برای پاسخ از پایگاه داده، منابع ارزشمند سیستم را بلوکه نکند. در این حالت، فرآیند Callback به دادههای بازگشتی از پایگاهداده تخصیص داده شده وهمزمان، نود به انجام امور دیگر میپردازد که خود از هدر رفتن سیکلهای CPU بیشتری جلوگیری میکند.
با استفاده از این روش، مرورگر سمت کلاینت تا فراهمشدن نتایج در حالت انتظار باقیمیماند و با حالت درخواست دادهها از سرور threaded سنتی، هیچ تفاوتی احساس نمیکند. پس از آماده شدن نتایج پرسوجو از پایگاهداده، کد مشخص شده بهعنوان Callback اجرا شده، اتصال مربوط را از انباره انتخابکرده و حالت آن را از وضعیت «درحال انتظار» خارج کرده و با استفاده از آن، دادههای لازم را به مرورگر ارسال میکند. استفاده از چنین ساختاری علاوه بر کاهش مصرف حافظه، سرعت اجرای بالایی را نیز به ارمغان میآورد (شکل۳). شکل ۳- معماری قدیمی، اکنون با استفاده از node.js تغییر یافته است. همانطور که میدانید، برنامههای تحت وب امروزی که بر مبنای AJAX کار میکنند، بار کاری سنگینی را به سرورهای خود تحمیل میکنند. در صورتی که به برنامههای گفتوگو یا بازیهای تحت مرورگر چند بازیکنی توجه کنیم، متوجه خواهیم شد که آنها اتصالهای همزمان بسیاری را ایجاد میکنند که زمان کم پاسخگویی به هر کدام از آنها بسیار مهم و حیاتی است.
در چنین کاربردهایی است که قوت Node.js مشخص شده و روش مورد استفاده آن برای مدیریت امور بسیار پر اهمیتتر از گذشته بهنظر میآید. اگرچه تلاشهای انجام شده برای استفاده از AJAX و Comet برای بهترکردن تجربه وب بسیار ارزنده بوده و سوکتهای HTML5 نیز تلاش قابل تقدیری برای توسعه و ایجاد سهولت در پاسخ به این نیازمندیها بودند، اما تکمیلکننده این حلقه، استفاده از فناوریهای جدید در سمت سرور بود که با معرفی و توسعه روزافزون Node.js به خوبی در حال شکلگیری است (شکل۴). شکل ۴- جایگاه کنونی نود در بازار سرورها در هر صورت، برای مقبولیت و گسترش روزافزون Node.js به اندکی زمان نیاز است تا توسعهدهندگانی که در چند سال اخیر و تاکنون بر مبنای پارادایمهای سنتی AJAX به توسعه کد میپرداختند، با روش جدید تطبیق پیدا کرده و به سوی آن گرایش پیدا کنند. زمانی که سایتهای معروف و برنامههای وب مبتنی بر AJAX هر کدام سرور اختصاصی خود را داشته باشند، چندان دور نیست. در صورتی که تجربه کار با AJAX، COMET یا جاوااسکریپت را داشتهاید، تجربه کار با Node.js را از دست ندهید. مطمئن باشید که پس از آن، هیچ علاقهای برای بازگشت به استفاده از PHP نخواهید داشت. Node.js در یک نگاه توسعه وب با استفاده از یک زبان داینامیک (جاوااسکریپت) که روی یک ماشین مجازی خیلی سریع با نام V۸ اجرا میشود. سرعت اجرای آن از Ruby ،Python و Perl بسیار بیشتر است. توانایی مدیریتکردن هزاران اتصال همزمان، با کمترین سربار و با استفاده از یک نرمافزار. شایستگی ذاتی جاوااسکریپت در کار با event loopها با داشتن اشیای درجه یک، قابل استفاده در توابع و همچنین نحوه بستنآنها که سالها توسط برنامهنویسان مختلف روی مرورگرها تمرین شده است. تعدد افرادی که برنامهنویسی با استفاده از جاوااسکریپت را میدانند یا در آن حرفهای هستند. به جرأت میتوان جاوااسکریپت را محبوبترین زبان برنامهنویسی حال حاضر دانست.
استفاده از جاوااسکریپت در سمت سرور به همراه استفاده از آن در سمت کلاینت، احتمال ناهمخوانی و بروز مشکلات و معضلات محیطهای ناهمگون برنامهنویسی را کاهشداده و امکان برقراری ارتباط دادهای با استفاده از JSON میان هر دو طرف را فراهم میسازد. استفاده از یک کد اعتبارسنجی فرم چه در سمت سرور و چه در سمت کلاینت واقعاً لذتبخش است. مزایا – مقیاسپذیر به هزاران اتصال فعال – بسیار سریع (به خصوص در مقایسه با PHP و Ruby) – امنیت بیشتر در مقابل بار اضافی اعمال شده به سرور (به خصوص در زمان وقوع حملههای DDOS که بقیه نرمافزارهای سرور مانند SSH قابل دسترسی و پاسخ دهنده باقی میمانند) – پارادایم ناهمزمان بسیار ساده، جذاب و آشنا – نیاز نداشتن به درگیری با مسائلی مانند thread-safety – عدم استفاده از Multithreading و به تبع آن، مواجه نشدن با باگهای قفلکننده – جامعه توسعهدهندگان بسیار عظیم و کتابخانهها و ابزارهای توسعهداده شده غنی به همراه یک Package Manager قوی برای مدیریت ملحقات! معایب – پیچیدگی کد برنامه ناهمزمان (Asyncronous) و مشکل بودن یادگیری مفاهیم اولیه برای برنامهنویسان ناآشنا با مدل برنامهنویسی موازی. – تأخیر بسیار بالا در صورت نیاز وظایف داخلی به اتمام عملیات محوله. به دلیل اینکه برنامه بهصورت تک رشتهای اجرا میشود، یک تابع با زمان اجرای طولانی میتواند سرعت پاسخدهی کلی سیستم را به شدت کاهش دهد.
– نبود یک کتابخانه استاندارد جاوااسکریپت. برنامهنویسان جاوااسکریپت به شدت به استفاده آسان از آن عادت کردهاند، بدون اینکه به وارد کردن کتابخانه خاصی نیاز داشته باشند. بههمین دلیل، از هر چیزی در برنامهها پنج مدل مختلف وجود خواهد داشت که سردرگمی خاصی را ایجاد میکند. حتی ماجولهای قرارداده شده در هسته Node.js نیز هر کدام پنج نوع مختلف دارند که به تکامل سریعتر میانجامد، اما درجه ابهام بالایی را نیز در پیخواهد داشت. – سیستمهای نهایی نوشتهشده با این فناوری بهشدت نسبت به مدل CGI، یعنی Apache+PHP یا Perl یا Ruby و… پیچیدهتر بوده و استثناهای مدیریتنشده میتوانند کل فرآیند را متوقفکرده و نیاز به راهاندازی دوباره فرآیندهای درحال کار روی کلاستر را الزامی سازند. یک کد باگ دار نیز میتواند باعث خرابی فرآیند اجرایی مربوط شده و هر فرآیند درحال کار خراب، درخواستهای بسیاری را بیپاسخ خواهدگذاشت که به تبع آن مقاومت کل سیستم در مقابل خرابی را کاهش داده و باعث کاهش کیفیت خدمات خواهد شد. طراحی سایت- طراحی وب منبع :ایتنا