مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

node.js یا .Net Core؟ کدام را انتخاب کنیم؟

این یک مقایسه ساده بین این دو تکنولوژی است که امروزه بسیار مورد استفاده کاربران قرار گرفته است .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

معرفی .Net Core

فریمورک دات نت یک فریمورک توسعه نرم‌افزار اوپن سورس است که ابتدا مالکیت آن به شرکت مایکروسافت تعلق داشت ولی بعداً در جامعه متن باز و نرم افزارهای آزاد عرضه شد. در اصل این فریمورک دو شاخه است یکی .net framework که فقط بر روی ویندوز اجرا می‌شود و نسخه cross platform آن که .net core نام دارد و بر روی تمامی سیستم عامل ها اجرا می شود. اما از زمان نسخه ۳ .net core مایکروسافت پشتیبانی از .net framework را متوقف کرد و فقط بر روی .net core تمرکز کرد و همه ویژگی‌های جدید را بر روی .net core ارائه کرد. از جمله ویژگی‌های .net core توانایی تولید برنامه برای محیط های دسکتاپ و وب و کلود و … است. این امر که مایکروسافت از .net core پشتیبانی کامل دارد و ابزارهایی مانند ویژوال استودیو برای توسعه نرم‌افزار با .net core ارائه شده است یکی از نقاط قوت .net core است.

معرفی Node.js

node.js یک محیط اجرای اوپن سورس است که برای تولید برنامه‌های شبکه ای به صورت سریع و مقیاس پذیر ارائه شده است. Node.js بر روی موتور جاوا اسکریپت کروم که V8 نام دارد اجرا می شود. نود جی اس به خاطر اینکه نحوه پیاده‌سازی آن برپایه رویداد (event-driven) است و همچنین برای ورودی و خروجی بلاک نمی‌شود non-blocking I/O در اپلیکیشن های real time مانند برنامه‌های چت و مسنجر ها به خوبی کار می کند. اما این فریمورک برای نوشتن برنامه‌هایی که پردازش سنگین دارند مانند پردازش تصویر و ویدیو اصلاً مناسب نیست.

تفاوت‌های مدل پردازش

node.js

Node.js فقط بر روی یک Thread(نخ) اجرا می‌شود. همین امر باعث می‌شود که منابع کمتری نسبت به حالت سنتی پردازش درخواست ها مصرف شود. حالت سنتی پردازش درخواست ها به شکلی است که هر زمان که کاربری یک درخواست به سرور می‌فرستد یک Thread برای او ساخته می‌شود و شروع می‌کند برای انجام درخواست های کاربر ولی در نود جی اس فقط یک thread داریم برای همه درخواست های همه کاربران. نحوه پردازش درخواست کاربران در node.js به این شکل است که درخواست را دریافت می‌کند و اگر درخواست قابل پردازش سریع باشد درخواست کاربر پردازش شده و نتیجه به او برگردانده می شود. اما اگر درخواست کاربر شامل صدا زدن یک API سنگین و یا پردازش طولانی باشد آن پردازش به حلقه رویداد سپرده می‌شود و Thread اصلی به کار خود ادامه می‌دهد و بقیه درخواست ها را پردازش می کند. بعد از اینکه حلقه درخواست پردازش مورد نظر را انجام داد با اجرای callback function نتیجه به thread اصلی گزارش می شود.

.Net core

اگر فکر می کند مدل پردازش درخواست های .net core هم همان مدل سنتی thread pool است اشتباه می کنید..net core از روش الگوی برنامه نویسی غیرهمگام (asynchronous) استفاده می‌کند. روش سنتی از thread pool همگام بلاک شدنی استفاده می‌کند به این معنی که وقتی یک تابعی اجرا می‌شود thread دست از اجرا برداشته و منتظر می‌ماند تا اجرای تابع مورد نظر تمام شود ولی غیرهمگامی منتظر اجرا نخواهد ماند. برای مثال DbContext.SaveChanges یک تابع همگام است برای ذخیره در دیتابیس ولی نسخه DbContext.SaveChangesAsync غیرهمگام و بلاک نشدنی است. .net core همچنین توانایی دریافت ورودی و خروجی ها را به صورت غیرهمگام نیز دارد و برای پردازش های سنگین مانند پردازش ویدیو و عکس نیز مناسب است ولی node.js برای این پردازش ها مناسب نیست.

سرعت (مقایسه کارایی (Performance))

وقتی می‌خواهیم کارایی را مقایسه کنیم باید دقت داشته باشیم که فاکتور های درستی را برای اندازه‌گیری کارایی در نظر بگیریم. برای مثال اینکه یک فریمورک سریع باشد با اینکه چقدر تحمل بار دارد دو سناریو متفاوت است و کارایی در هر کدام متفاوت اندازه‌گیری می شود. مثلاً اگر بخواهیم سرعت یک سرور را با مقیاس مدت زمان پردازش یک درخواست اندازه بگیریم بسیار سریع باشد ولی اگر سرور مورد نظر وقتی که 500 درخواست همزمان داریم نتواند کنترل بار کند بسیار کند خواهد شد.

در بحث کنترل بار Node.js بسیار محبوب است. به دلیل اینکه .Net به هر درخواستی یک thread از thread pool اختصاص می‌دهد و اگر امکان ایجاد thread جدید نباشد درخواست ها در صف نگهداری می‌شوند. اما اگر درخواست ها بلاک شدنی نباشند این مشکل حل خواهد شد. بنابراین می‌بینیم که نوع درخواست ها نیز در کارایی تأثیر دارند.

همچنین نوع صفحات وب نیز می‌تواند بر کارایی تأثیر داشته باشد. برای مثال رندر کردن صفحات استاتیک .net core احتمالاً بهتر خواهد بود چون از IIS داخلی استفاده می‌کند و IIS هم از کش کردن مد هسته (Kernel-mode) استفاده می‌کند که باعث سریع‌تر شدن می شود. زیرا که هسته سیستم عامل پردازش کش را انجام داده و نیاز به برنامه دیگری نیست.

همچنین .net core پردازش های سنگین را بهتر از node.js انجام می‌دهد و در هر آپدیت .net core سعی می‌کند که محدودیت‌ها و مشکلاتش را بهبود بخشد در حدی که در این آپدیت آخر به .net 5 کارایی سمت سرور از بقیه زبان‌های پیشرو مانند جاوا و go بهتر بود.

بنچمارک های مقایسه .net core و node.js

در ادامه از بنچمارک برخی از سایت‌ها و بنچمارک هایی که خود مایکروسافت گرفته است، استفاده کرده‌ایم برای اینکه ببینیم سرعت و کارایی کدام بهتر است. اولین بنچمارک از سایت techempower.com گرفته شده است. در این بنچمارک زمان پاسخ برای نتیجه متنی ساده Hello world نمایش داده شده است که سخت‌افزار همه Dell R440 Xeon Gold+10GbE بوده است.دقت کنید که در تصویر های اول که کارایی نمایش داده می‌شود تعداد نتیجه در ثانیه را نمایش می‌دهد که هرچه بیشتر باشد بهتر است.

 node.js یا .Net Core؟ کدام را انتخاب کنیم؟

تأخیر

به یاد داشته باشید که سروری خوب است که تأخیر کمتری در پاسخ داشته باشد. با اینکه نمودار ها تفاوت زیادی را نشان می‌دهند دقت داشته باشید که تفاوت‌ها در حد میلی ثانیه است و در پروژه های کوچک تفاوتی نخواهید دید و این تفاوت در پروژه های بزرگ با درخواست های بسیار زیاد خود را نشان خواهد داد. تأخیر یک برنامه ساده را در تصویر زیر می‌بینید

 node.js یا .Net Core؟ کدام را انتخاب کنیم؟

پردازش یک کوئری

یک کوئری ساده به سرور ارسال می‌شود و نتیجه دریافت می گردد. این کوئری یک سطر از یک دیتابیس ساده را خوانده و تبدیل به json کرده و بر‌می‌گرداند بنچمارک کارایی دسترسی به سرور در تصویر زیر آمده است.

 node.js یا .Net Core؟ کدام را انتخاب کنیم؟

همچنین بنچمارک تأخیر در دسترسی به دیتابیس نیز در تصویر زیر آمده است که مشاهده می‌کنید

 node.js یا .Net Core؟ کدام را انتخاب کنیم؟

در این تصویر نود کمترین تأخیر را دارد ولی در حد میلی ثانیه


پردازش چند کوئری

در این تست هر درخواست به این شکل پردازش می‌شود که چندین سطر از یک جدول دیتابیس را استخراج کرده و آن را تبدیل به json کرده و به عنوان جواب پاسخ می‌دهد این تست چند بار اجرا می‌شود یعنی هر در هر درخواست ۱،5،۱۰،۱۵،۲۰ کوئری اجرا می‌شود و نتیجه را در تصویر زیر می‌توانید ببینید.

 node.js یا .Net Core؟ کدام را انتخاب کنیم؟

همچنین میزان تأخیر در پردازش چندین کوئری

 node.js یا .Net Core؟ کدام را انتخاب کنیم؟همانطور که در نمودار های سایت techempower.com دیدیم .net core کارایی بیشتری را در زمینه‌های مختلف نسبت به node.js از خود نشان داد. این تست ها با تغییر دیتابیس از دیتابیس محلی و کلود نیز انجام شده است که نتیجه نشان می‌دهد که .net core کارایی بالاتری دارد.

پشتیبانی کامیونیتی ها

وقتی صحبت از پشتیبانی کامیونیتی ها می‌شود هر دو تکنولوژی پشتیبانی بسیار قوی دارند. به خاطر اینکه node.js از همان ابتدا کار خود را بر روی github شروع کرد پشتیبانی کامیونیتی بسیار قوی رو سایت گیت هاب دارد ولی در مقابل .net core پشتیبانی کامیونیتی قوی روی سایت stackoverflow دارد. اما پشتیبانی دیگری که .net core از آن برخوردار است کانال رسمی یوتیوب Dotnet Youtube channel است که روزانه محتوای ارزشمندی را در اختیار کاربران و برنامه نویسان قرار می دهد.

پشتیبانی پلتفرم

ازهمان ابتدا node.js بر روی پلتفرم های مختلف اجرا می شد. شاید یکی از دلایل محبوب شدنش همین بود. به صورت رسمی node.js ویندوز و لینوکس و macOs, SmartOsو IBM‍ را پشتیبانی می کند. اما .net core در ابتدا برای ویندوز عرضه شد ولی از سال 2018 در یک حرکت انقلابی بر روی ویندوز و لینوکس و مک عرضه شد.

موارد استفاده از node.js

node.js برای پردازش کردن چندین وظیفه به صورت همزمان مناسب است و دلیل این کار هم به خاطر نحوه پیاده‌سازی تک نخی آن است. زبان برنامه نویسی node.js همان جاوا اسکریپت است و برنامه نویسان می‌توانند از یک زبان برنامه نویسی برای backend و frontend استفاده کنند. برنامه نویسان می‌توانند از کتابخانه‌های بسیاری که برای node.js نوشته شده است و می‌توان آن را با npm نصب کنند در زمان کوتاهتر و سرعت بیشتری برنامه‌های خود را بنویسند. با node.js شما می‌توانید با استفاده از سرور های ساده‌تر و دارای منابع پردازشی پایین‌تر حجم زیادی از ترافیک را پاسخ‌گو باشید.

مزایای استفاده از node.js

  • از جاوااسکریپت هم برای توسعه frontend و backend استفاده می‌شود.
  • Node.js در همه پلتفرم ها موجود است و از همان ابتدا غیرهمگام و asynchronous بوده است.
  • بسته ها و کتابخانه‌های بسیار زیادی برای آن وجود دارد که می‌توان با استفاده از npm از آن‌ها استفاده کرد.
  • به خاطر اینکه کدها ماژول بندی شده‌اند می‌توان از ماژول ها در پروژه های مختلف استفاده کرد بدون اینکه اثرات جانبی را داشته باشیم.

موارد استفاده از .Net core

.Net core بر اساس زبان برنامه نویسی شی گرای #C ساخته شده است که می‌توان از آن با زبان #F هم استفاده کرد. در .Net core کتابخانه‌های مخصوصی برای دسترسی به دیتابیس و امنیت و رمزگذاری و … وجود دارد که می‌توان برای موارد مختلف از آن‌ها استفاده کرد.

از .Net core به خاطر ظرفیت پردازشی بالا می‌توان در برنامه‌های مختلف دسکتاپ و وب و کلود و موبایل و بازی سازی و IoT و هوش مصنوعی و یادگیری ماشین استفاده کرد.

به خاطر ظرفیت بالای ماژول بندی و مقیاس پذیری که دارد می‌توان از آن در ساختن مایکروسرویس ها استفاده کرد.

به خاطر اینکه بسیاری از شرکت ها و ادارات از بسته office یا office 365 استفاده می‌کنند با استفاده از .net core می‌توان افزونه هایی را برای نرم افزارهای آفیس نوشت تا قابلیت‌های آن‌ها را بیشتر کند.

مزایای استفاده از .net core

  • قابلیت تفکیک دغدغه ها (Separation of Concerns)
  • کم کردن زمان کدنویسی در صورت استفاده از کتابخانه‌های آماده داخلی
  • امنیت
  • محیط برنامه نویسی قوی و ابزارهای قدرتمند ویژوال استودیو
  • چند پلتفرمی بودن
  • قابلیت توسعه برنامه برای محیط های مختلف کلود و دسکتاپ و …

شرکت های بزرگی که از Node.js استفاده می‌کنند:

Paypal, Netflix, Uber, LinkedIn, eBay

شرکت های بزرگی که از .net core استفاده می کنند:

Chipotle, UPS, GoDaddy, Asgard Systems, Siemens Healthineers

نتیجه‌گیری

با توجه به بنچمارک های ارائه شده و سایر بنچمارک های سایت‌های دیگر نتیجه نشان می‌دهد که .net core با پشتیبانی مایکروسافت حرکت عظیمی را برای پیشی گرفتن از nodejs شروع کرده است. اما برای انتخاب از بین این دو باید به نیازمندی های مجموعه و توانایی‌های پرسنل و سایر فاکتور ها نیز توجه داشت. همچنین Node.js بر روی موتور V8 اجرا می‌شود که آن‌ها با ++C توسعه داده شده است. یعنی یک لایه نرم افزاری دیگر دارد و همچنین به صورت مفسری اجرا می‌شود. اما در طرف دیگر خروجی برنامه‌های .net فایل‌های کامپایل شده dll است که تا حدودی راه را برای اجرا کوتاهتر و سریعتر می کند.


اگر نظری در مورد رد نظرات بنده و یا تأیید آن دارید در زیر همین مطلب بیان کنید.


با وب سایت tosinso همراه باشید

نویسنده مهدی عادلی فر



مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات