دلیل محبوبیت node.js

دوشنبه, 08/29/2011 - 08:15 -- admin

به جرأت میتونم بگم nodejs انقلابی‌ترین حرکت در زمینه توسعه وب توی یکی دو سال گذشته بوده. node در github سومین پروژه از لحاظ محبوبیته و همین الان که من دارم این مطلب رو می‌نویسم

 

 این پروژه بیش از 4000 تماشاچی داره و بیش از 400 بار fork خورده و 100 ها ماژول براش نوشته شده و همه این اتفاقات در کمتر از یک سال و اندی که از شروع این پروژه می‌گذره افتاده.

به جرأت میتونم بگم nodejs انقلابی‌ترین حرکت در زمینه توسعه وب توی یکی دو سال گذشته بوده. node در github سومین پروژه از لحاظ محبوبیته و همین الان که من دارم این مطلب رو می‌نویسم

 

 این پروژه بیش از 4000 تماشاچی داره و بیش از 400 بار fork خورده و 100 ها ماژول براش نوشته شده و همه این اتفاقات در کمتر از یک سال و اندی که از شروع این پروژه می‌گذره افتاده.

اگر اخبار و تحولات توسعه وب رو دنبال کرده باشید حتما تا به حال مطالبی در موردش شنیدید اما ممکنه به اهمیت موضوع پی نبرده باشید. به عبارت دیگه اکثر افراد در وهله اول متوجه نمیشن که node چه چیز جدیدی برای ارائه داره و چی باعث محبوبیت اون شده.

اگر می‌خواهید در مورد node بیشتر بدونید در ادامه این مطلب با من همراه باشید.

 

حالا این node.js چی هست؟ یک فریم ورک جدید مثل jquery؟

نه اشتباه نکنید. node.js هیچ ربطی به مرورگر نداره و کدی که برای node نوشته میشه قرار نیست روی مرورگر اجرا بشه.

پس لابد یک زبان برنامه نویسی جدیده!

زبان جدید هم نیست. برنامه‌های node به زبان جاوا اسکریپت نوشته میشن. جاوا اسکریپتی که سمت سرور اجرا میشه. البته از node میشه برای نوشتن برنامه‌های غیر سروری هم استفاده کرد ولی بیشتر کاربردش برای نوشتن برنامه‌های سروری مخصوصا وبسرورهاست.

پس node رو میشه مثل php و python روی وبسرور نصب کرد.

نه. node مستقله. در واقع node خودش وبسرور داره و از وبسرور فعلی شما (مثلا آپاچی) استفاده نمیکنه.

میشه دقیقتر توضیح بدی یک برنامه تحت وب با node چه جوری اجرا میشه؟

node از طریق خط دستور (command line) اجرا میشه و برنامه شما رو اجرا میکنه. حالا برنامه شما میتونه از ماژول وبسرور node استفاده کنه و یک وبسرور راه بندازه.

ولی من هر کاری که بخوام با php و python و ruby و … میتونم انجام بدم.

خوب آره. node هم قرار نیست کار جدیدی که قبلا غیر ممکن بوده رو انجام بده. قرار هم نیست جای php و python و … رو بگیره. حداقل هنوز نه.

خوب پس چی باعث شده اینقدر طرفدار پیدا کنه؟

دلایل مختلفی داره. اگر ایده و هدف اصلی node و نحوه کارش رو بدونید خیلی از دلایلش مشخص میشه.

هدف node ایجاد راهکاری آسان برای نوشتن برنامه‌های مرتبط با شبکه با سرعت، کیفیت و مقیاس پذیری بالاست. پس دلیل اول محبوبیت node رو میشه این جوری نوشت که با node حتی برنامه‌نویس‌های غیرحرفه‌ای هم می‌تونن برنامه‌های حرفه‌ای برای شبکه بنویسند.

مگه node چه جوری کار میکنه؟

سوال خیلی خوبیه. برای اینکه به این سوال جواب بدیم اول باید ببینیم که بقیه وبسرورها چه جوری کار می‌کنند.

معمولا وبسرورها اینجوری کار می‌کنند که به ازای هر کانکشن یک thread جدید می سازند و این thread تا زمانی که کانکشن مربوطه باز باشه باقی می‌مونه. این کار بار پردازشی و مصرف مموری اضافی برای هر کانکشن ایجاد میکنه و به عبارتی باعث میشه تعداد کلاینت هایی که یک وبسرور همزمان میتونه پاسخگو باشه محدود باشه، عددی که به 10 هزار نمیرسه. برای همین این مشکل با نام «مسئله 10 هزار کانکشن همزمان» یا C10K معروفه. البته این مسئله‌ی جدیدی نیست. بحث سر این مسئله و راهکارهای موجود از حدود 11 سال پیش وجود داشته. وبسرورهای جدید نظیر nginx و lighttpd و cherokee این مشکل رو حل کردند. و البته node.js هم با توجه به هدف اولیه ای که داشته جزو اون دسته از وبسروهایی محسوب میشه که این مشکل رو ندارند.

و این مشکل چطور حل شده؟

قبل از اینکه به راه حل مشکل بپردازیم باید ببینیم مشکل از کجا ناشی میشه.

مشکل از اونجایی ناشی میشه که دریافت، پردازش و پاسخ دادن به یک درخواست از یک کلاینت اونقدر طول میکشه که نمیشه برای دریافت کانکشن بعدی منتظر اتمام کار کانکشن قبلی موند. بنابراین وبسرورها برای پاسخ به کلاینت جدید یک thread جدید ایجاد می‌کردند.

خوب پس مشکل اصلی در واقع کند بودن روند دریافت، پردازش و پاسخ  هست.

دقیقا. اما مسئله اینجاست که پردازنده ها به اندازه کافی سریع هستند و اون چیزی که باعث کند شدن این روند میشه I/O هست. یعنی عملیات ورودی و خروجی، چه از شبکه و چه از سیستم فایل.

اونوقت مشکل IO رو چطور حل کردند؟

برای رفع این مشکل به جای اینکه عملیات ورودی/خروجی مستقیما انجام بشه از معماری رویداد گرا برای پیاده سازی IO استفاده میشه. به عبارتی به جای اینکه منتظر نتیجه IO بمونیم یک رویداد برای دریافت نتیجه تعریف می‌کنیم و اجرای برنامه ادامه پیدا میکنه. به این ترتیب عملیات های ورودی/خروجی باعث بلاک شدن اجرای برنامه نمیشه. و node هم با همین معماری نوشته شده برای همین اولین جمله ای که در توصیف node در سایتش نوشته شده اینه: «Evented I/O for V8 JavaScript»

اگر وبسرورهایی مثل nginx قبلا این مشکل رو حل کردند پس node چه حرفی واسه گفتن داره؟

درسته که این مشکل قبلا حل شده ولی این مشکل فقط در سطح وب سرور حل شده. منظورم اینه که مثلا وقتی میخوای یک برنامه php رو روی این وبسرور اجرا کنی با اینکه وبسرور برای هر درخواست thread ایجاد نمیکنه ولی php این کار رو میکنه.

پس با این حساب node راهکاری برای برنامه نویسی رویداد گرای IO سمت سرور فراهم کرده.

درسته. البته node اولین نیست. قبل از node این سبک برنامه نویسی با Twisted در python و EventMachine در ruby هم امکان پذیر بوده. خود برنامه نویس node هم گفته که توی طراحی node از این دو پروژه ایده گرفته.

پس چرا اونها به اندازه node معروف نشدند؟

دلایل مختلفی داره.

یکی اینکه برنامه های node به زبان جاوا اسکریپت نوشته میشن. و اکثر کسانی که تو کار توسعه وب هستند کم و بیش با این زبان آشنایی دارند. علاوه بر این زبان جاوا اسکریپت زبان فوق العاده ای برای معماری رویداد گراست و اکثر کسانی که قبلا با جاوا اسکریپت برای مرورگر کد نوشتند برنامه نویسی رویداد گرا با جاوا اسکریپت رو تجربه کردند.
یک مزیت دیگه جاوا اسکریپتی بودن اینه که برای برنامه نویسی سرور و کلاینت از یک syntax استفاده میشه که قطعا راحت تره و حتی بخش‌هایی از کد رو برای هر دو طرف میشه استفاده کرد (مثل اعتبار سنجی فرمها).
دیگه اینکه node برای موتور جاوا اسکریپت از V8 استفاده میکنه که جزو سریعترین مفسرهای اسکریپتی محسوب میشه و حتی از پایتون هم سریعتره.
دلیل دیگه اینه که node از اول با این ایده یعنی رویداد گرا طراحی شده نه به صورت یک library جداگانه، بنابراین کار باهاش خیلی راحت تره.

ولی به درد من نمی‌خوره. من هیچ وقت 10 هزار تا بازدیدکننده همزمان ندارم. مشکلی هم با سرعت برنامه هام ندارم.

مسئله فقط سرعت و مقیاس پذیری نیست.

برای مقایسه یک برنامه php رو در نظر بگیرید. هر بار که یک درخواست به سرور ارسال میشه برنامه php اجرا میشه و یک نتیجه ای رو بر میگردونه و تموم میشه. ولی برنامه ای که با node نوشته شده یکبار اجرا میشه و تو حافظه می‌مونه. اینجا به جای اینکه وب‌سرور برنامه رو اجرا کنه این برنامه هست که وب‌سرور رو اجرا می‌کنه. بنابراین برنامه به همه کانکشن‌های سرور دسترسی داره و مثلا میتونه اطلاعاتی رو از یک کلاینت بگیره و به یک کلاینت دیگه بفرسته بدون اینکه از دیتابیس یا shared memory استفاده کنه. برای مثال با این ویژگی میشه بدون استفاده از دیتابیس و یا هیچ ابزار جانبی دیگه ای یک چت روم نوشت.
یک مثال دیگه از قابلیت‌های node حالتیه که برای همه درخواست ها احتیاج به یکسری اطلاعات مشترک داریم که باید از دیتابیس خونده بشه. با php یا باید همه اطلاعات هر بار از دیتابیس خونده بشه و یا اینکه یکبار کش بشه و دفعات بعد از کش خونده بشه. ولی با node میشه این اطلاعات رو یکبار خوند و برای همه کانکشن ها ازش استفاده کرد.

در ضمن امروزه با فراگیر شدن وب 2 استفاده از comet هم رایج تر شده. برای پیاده سازی comet در واقع یک کانکشن به سرور برقرار میشه و باز نگه داشته میشه. که با وبسروری مثل آپاچی با زیاد شدن تعداد کانکشن‌ها عملا این کار غیر ممکن میشه. ولی node برای این کار فوق العادست.

نکته دیگه ای که در مورد node وجود داره تعدد ماژول هاشه. تقریبا توی هر زمینه ای که بخواهید برای node ماژول پیدا میشه.

برای نمونه socket.io ماژولی برای پیاده سازی ارتباط دو طرفه بین سرور و مرورگر هست. این ماژول برای پیاده سازی comet تقریبا از همه روش‌های موجود نظیر Ajax long pulling و Flash Socket و WebSocket پشتیبانی می‌کنه و بسته به اینکه مرورگر شما با کدامیک از این روش‌ها سازگار باشه خودش بهترین روش ممکن رو انتخاب می‌کنه. و تقریبا همه مرورگرهای رایج رو پشتیبانی می‌کنه.
با این ماژول به راحتی میشه ارتباطات دوطرفه و بلادرنگ بین سرور و کلاینت برقرار کرد.

خلاصه اینکه ابزارها و ماژول های فوق العاده ای برای node نوشته شده نظیر express و hummingbird و vows و ماژولهای مختلفی برای کار با دیتابیس‌های مختلف. حتی به خاطر تعدد ماژولها برای node ابزار مدیریت بسته ها (node package manager) هم نوشته شده تا نصب و بروزرسانی ماژول‌ها راحت تر باشه.

خوب دیگه فکر کنم همینقدر برای شروع کافی باشه.

برای حسن ختام چند تا لینک مرتبط هم معرفی میکنم:

  • Understanding node.js مقاله‌ای برای معرفی node.js
  • howtonode.org یک وبلاگ جمعی درباره node.js
  • Node Modules لیستی از ماژولهای node
  • Node Hostings لیستی از میزبان‌هایی که از node پشتیبانی می‌کنند.
  • علی فرهادی

آدرس دفتر فروش

تهران نازی آباد خیابان فاطمی خیابان کارگر سامانی پ۱۶۲

تلفن :۵۵۵۳۰۷۶۱-۰۲۱ و ۰۹۱۹۸۹۱۴۸۳۵  

Email : jalalimehdi@gmail.com

Website : www.softwareco.ir

خبرنامه

اطلاع از آخرین اخبار سایت دلفین