همه ما عاشق Node.js هستیم چون خیلی سریع بالا میاد، اکوسیستم پکیج هاش (NPM) غوله و کار باهاش لذت بخشه. اما یه جاهایی هست که نود جیاس کم میاره. وقتی پای پردازشهای خیلی سنگین CPU، محاسبات پیچیده ریاضی، یا کار با ویدیو و تصویر وسط میاد، نود جیاس نفس نفس میزنه.
اینجاست که Rust مثل یه قهرمان وارد صحنه میشه تا به برنامه مون نیترو بزنه!
چرا اصلاً باید به فکر Rust بیفتیم؟
نود جیاس ذاتا تکرشتهای (Single-threaded) هست و برای کارهای I/O (مثل دیتابیس و وبسرویس) عالیه. اما وقتی یه تسک سنگین بهش میدید، Event Loop رو قفل میکنه و کل برنامه "هنگ" به نظر میرسه.
حالا چرا Rust؟
-
سرعت فضایی: راست مستقیماً به کد ماشین تبدیل میشه و هیچ Garbage Collector ای نداره که وسط کار سرعت رو بگیره.
-
امنیت حافظه: برخلاف C++، توی راست خیالتون راحته که با خطاهای عجیب و غریب حافظه (مثل Segfault) روبرو نمیشید.
-
ترکیب برنده: شما منطق اصلی برنامه رو با همون جاوا اسکریپت خوش دستمون مینویسید، ولی اون بخش های سنگین رو میسپرید به دست رستمِ دنیای برنامهنویسی، یعنی Rust!
چطوری این دو تا رو به هم وصل کنیم؟
شاید فکر کنید وصل کردن این دو تا زبان به هم خیلی سخته، اما خبر خوب اینه که ابزار های خفنی برای این کار ساخته شده. مهمترینشون N-API هست که مثل یه مترجم بین دنیای Node.js و زبانهای سیستمی عمل میکنه.
ابزارهای پیشنهادی:
-
Neon: محبوب ترین فریمورک برای نوشتن ماژولهای نود جیاس با راست. کار باهاش خیلی راحته و خودش کلی از کارهای سخت رو براتون انجام میده.
-
NAPI-RS: اگه دنبال پرفورمنس خالص و بالاترین سرعت هستید، این پکیج فوق العاده ست.
یه مثال واقعی (بیا تو گود!)
تصور کنید میخوایم یه الگوریتم سنگین (مثلاً محاسبه فاکتوریلهای بزرگ یا فشرده سازی فایل) رو انجام بدیم.
-
توی Rust تابع رو مینویسیم و به کمک Neon اون رو اکسپورت میکنیم.
-
توی Node.js اون رو دقیقاً مثل یه کتابخونه معمولی
requireیاimportمیکنیم.
نتیجه چی میشه؟ کاری که ممکنه توی جاوااسکریپت ۱۰ ثانیه طول بکشه، توی راست در عرض چند میلیثانیه تموم میشه!
حالا تصور کنید میخواهیم عدد فیبوناچی (که یک محاسبه سنگین برای CPU است) را حساب کنیم. اگر این کار را با جاوا اسکریپت معمولی انجام دهیم، در عددهای بالا سیستم حسابی داغ میکند.
مرحله اول: نصب ابزار
ما از ابزار فوقالعاده napi-rs استفاده میکنیم که پل ارتباطی ماست:
npm install -g @napi-rs/cli
napi new my-rust-module
مرحله دوم: نوشتن کد Rust (قلب تپنده)
توی فایل src/lib.rs این کد را مینویسیم. این تابع قرار است با سرعت نور اجرا شود. برای محاسبه عدد n-اُم فیبوناچی از فرمول بازگشتی استفاده میکنیم:
use napi_derive::napi;
#[napi]
pub fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
حالا با دستور npm run build آن را کامپایل میکنیم تا فایل باینری مخصوص نود جیاس آماده شود.
npm run build
مرحله سوم: استفاده در Node.js
حالا خیلی شیک و مجلسی توی index.js از آن استفاده میکنیم:
const { fibonacci } = require('./index.node');
console.time('Rust_Speed');
const result = fibonacci(40);
console.timeEnd('Rust_Speed');
console.log(`نتیجه: ${result}`);
کی از Rust استفاده کنیم؟ (و کی نکنیم؟)
جوگیر نشوید! قرار نیست از فردا کل کدهای نود جیاس را با راست بنویسیم.
وقتی برو سراغ Rust که:
-
داری کار گرافیکی یا پردازش تصویر/ویدیو انجام میدی.
-
نیاز به رمزنگاری (Cryptography) خیلی سریع داری.
-
تسکهای CPU-bound داری که Event Loop را بلاک میکنند.
وقتی سراغ Rust نرو که:
-
فقط داری یک API ساده برای دیتابیس مینویسی.
-
بیشتر کارت با شبکه و درخواستهای HTTP است.
-
تیمت اصلاً با راست آشنا نیست و وقت یادگیری هم ندارید.
جمعبندی
ترکیب Node.js و Rust یعنی داشتنِ همزمانِ "سرعت توسعه" و "سرعت اجرا". شما با این کار میتونید اپلیکیشن هایی بسازید که هم منعطف باشن و هم در مقابل بارهای ترافیکی سنگین، آخ نگن!
اگه حس میکنید پروژه تون داره کند پیش میره و گلوگاه (Bottleneck) اصلی تون پردازش های سنگینه، همین امروز برید سراغ Neon و اولین ماژول راستی تون رو بنویسید.
یه نکته دوستانه: اول با ابزارهای مانیتورینگ مطمئن بشید که مشکل واقعاً از CPU هست، بعد برید سراغ راست. شاید با یه ایندکسگذاری ساده توی دیتابیس مشکلتون حل شد و نیازی به توپ و تانک نبود!
نظرات کاربران (0)