Press "Enter" to skip to content

Rust در وب؛ وقتی سرعت C و راحتی Node.js در یک بدن جا می‌گیرند

اگر تا حالا وب‌نویسی کرده‌اید، احتمالاً با جاوااسکریپت، PHP، یا شاید Python و Ruby طرف بوده‌اید. این زبان‌ها سریع نیستند (بله، می‌دونم که بعضی‌هاشون ادعا می‌کنن هستن!) ولی توسعه باهاشون راحته. حالا تصور کنید زبانی داشته باشید که هم مثل C سریع باشه، هم مثل Python توسعه‌پذیر و خوانا، و هم مثل جاوااسکریپت با ابزارهای مدرن وب هماهنگ. بله، داریم درباره Rust صحبت می‌کنیم.

Rust در نگاه اول شاید شبیه زبانی نباشه که بخواهید باهاش یک REST API یا اپلیکیشن وب بنویسید. بیشتر به درد کرنل سیستم‌عامل یا موتور بازی می‌خوره، نه؟ ولی اشتباه نکنید. Rust توی وب هم حرف زیادی برای گفتن داره، و شاید تعجب کنید اگر بدونید که بعضی از سریع‌ترین و ایمن‌ترین سرورهای وب مدرن، دارن با Rust نوشته می‌شن.

ابزارها و فریم‌ورک‌های Rust برای وب

Actixیکی از ستون‌های اصلی Rust در وب، فریم‌ورک Actix-web هست. این فریم‌ورک با استفاده از سیستم Actor مدل، سرورهایی بسیار سریع، ناهم‌زمان و مقاوم می‌سازه. یعنی اگه یه کلاینت نصفه‌شب با 5000 تا درخواست بیاد سراغتون، Actix-web فقط یه خمیازه می‌کشه و به کارش ادامه می‌ده. در بنچمارک‌ها، این فریم‌ورک گاهی حتی از Node.js و Go هم جلوتره. البته به قیمت کمی پیچیدگی بیشتر در فهم کانسپت‌ها.

اگه دنبال فریم‌ورکی با API تمیزتر و تجربه توسعه راحت‌تر باشید، Axum انتخاب فوق‌العاده‌ایه. Axum روی async/await و tokio بنا شده و طراحی مینیمالی داره. با استفاده از توابع handler و تایپ‌های قوی، بهتون اجازه می‌ده هم امن‌ترین و هم تمیزترین کد ممکن رو بنویسید. ترکیب Result, Option, pattern matching و handlerهای تایپ‌شده یعنی شما عملاً نمی‌تونید اشتباه بحرانی مرتکب بشید… چون کامپایلر اجازه نمی‌ده!

وقتی نوبت به async می‌رسه، Rust با استفاده از tokio (یا در موارد سبک‌تر async-std) کار می‌کنه. بر خلاف Node.js که فقط single-thread هست، در Rust می‌تونید انتخاب کنید چند تا thread همزمان کار کنن، بدون اینکه هیچ کدوم به data race بخورن. البته کامپایلر ممکنه برای این کار چند بار دعواتون کنه، ولی نگران نباشید، در نهایت ازتون یه برنامه‌نویس بهتر می‌سازه.

برای مدیریت وابستگی‌ها، ساختار پروژه، تست و دیپلوی، باز هم برمی‌گردیم به cargo. با cargo run می‌تونید سرورتون رو اجرا کنید، با cargo watch تغییرات رو به‌صورت زنده ببینید و با cargo test مطمئن بشید که APIهاتون هنوز سالم هستن. یه جورهایی مثل nodemon، jest و npm در یک ابزار جمع شده، فقط بدون دردسر.

دیتابیس

اگه دنبال ارتباط با دیتابیس باشید، گزینه‌های زیادی پیش روی شماست. کتابخونه‌هایی مثل sqlx (برای اجرای مستقیم کوئری‌های SQL با تایپ ایمن)، یا diesel (ORM قدرتمند ولی با یک منحنی یادگیری خاص خودش) وجود دارن. هر دو به شما اجازه می‌دن به دیتابیس‌های Postgres، SQLite و MySQL متصل بشید. sqlx حتی کوئری‌های شما رو زمان کامپایل چک می‌کنه. یعنی اگه یه جدول اشتباه بنویسید، قبل از اینکه برنامه اجرا بشه، براتون هشدار می‌ده. به این می‌گن «در لحظه خجالت نکش، موقع اجرا آبرو نره!»

فرانت‌اند

در بخش فرانت‌اند هم Rust بیکار نیست. با ابزارهایی مثل Yew یا Leptos می‌تونید اپلیکیشن‌های SPA با WebAssembly بسازید. یعنی فرانت‌انتی در حد React، ولی به زبان Rust. اگر از جاوااسکریپت خسته شده‌اید و دنبال ایمنی حافظه، مدیریت خطا و کامپایل تایم جدی هستید، این ابزارها نجات‌دهنده‌ان. البته فعلاً WebAssembly محدودیت‌هایی داره، ولی Rust باهاش بهتر از هر زبان دیگه‌ای کنار اومده.

در نهایت، استفاده از Rust برای برنامه‌نویسی وب شاید در نگاه اول پرچالش به نظر بیاد، ولی اگر دنبال برنامه‌ای هستید که سریع، امن، مقیاس‌پذیر و قابل نگهداری باشه، Rust یه انتخاب واقعاً جدیه. یادگیریش شاید یه مقدار طول بکشه، ولی نتیجه‌ش کدی هست که هم شما ازش راضی هستید و هم تیم پشتیبانی‌ای که قراره شش ماه بعدش باهاش کار کنه (که احتمالاً بازم خودتونید).

پس اگه تصمیم دارید یه API بنویسید که روزی قراره میلیون‌ها درخواست رو هندل کنه، یا یه وب‌سرور که توی پروژه‌ی بعدیتون بدرخشه، شاید وقتشه به Rust یه شانس بدید. به قول خود کامپایلرش:

“This might be a bit hard now, but I promise it’s worth it.”

5 نظر

  1. نیما نیما 27 اردیبهشت 1404

    سلام، ممنون بابت مطلب مفید و باحال‌تون. یه سوال داشتم: با توجه به اینکه Rust کامپایل‌شونده‌ست و یه‌کم دست‌وپاگیر به نظر میاد، واقعاً استفاده ازش برای وب در پروژه‌های واقعی (مثلاً یه فروشگاه اینترنتی یا یه API بزرگ) منطقیه؟ یا فقط بیشتر به درد پروژه‌های خیلی خاص یا سطح پایین می‌خوره؟

    • حلزون مکانیکی حلزون مکانیکی نویسنده پست | 27 اردیبهشت 1404

      سلام! خیلی سوال خوبیه و اتفاقاً دغدغه خیلی از برنامه‌نویس‌ها همین‌جاست.
      واقعیت اینه که Rust شاید در نگاه اول شبیه یه زبان خاص برای سیستم‌عامل و موتور بازی باشه، ولی توی چند سال اخیر واقعاً خودش رو به عنوان یه گزینه جدی برای وب اثبات کرده. فریم‌ورک‌هایی مثل Actix-web و Axum الان در شرکت‌های واقعی توی محیط‌های production استفاده می‌شن (مثلاً Cloudflare یا Amazon بعضی سرویس‌هاشون رو با Rust نوشتن).
      در مورد پروژه‌هایی مثل فروشگاه اینترنتی، بله، کاملاً شدنیه. شما می‌تونید با Axum یه معماری تمیز بر پایه routeهای تایپ‌شده و async بسازید، و با sqlx یا diesel دیتابیس رو به شکل امن هندل کنید. تنها تفاوت اینه که Rust برای توسعه اولیه زمان بیشتری می‌بره، ولی نتیجه‌ش یک سیستم امن‌تر، سریع‌تر و با هزینه‌ی نگهداری کمتر در درازمدته.
      خلاصه اینکه: اگه دنبال توسعه سریع prototype هستید شاید Python یا Node هنوز گزینه‌های بهتری باشن، ولی اگه پروژه‌تون قراره بزرگ شه، یا performance و ایمنی براتون مهمه، Rust نه‌تنها منطقیه، بلکه آینده‌داره.

  2. امیر امیر 27 اردیبهشت 1404

    سلام و خسته نباشید بابت مطلب جذاب و پر از نکته‌تون. یه سوال: توی Rust برای کار با APIهای JSON (مثلاً دریافت و ارسال داده توی REST API)، چه ابزاری وجود داره؟ آیا مثل زبان‌هایی مثل Node یا Python ساده و سرراست هست؟ یا باید خودمون دستی JSON رو پردازش کنیم؟

    • حلزون مکانیکی حلزون مکانیکی نویسنده پست | 27 اردیبهشت 1404

      خوشبختانه کار با JSON توی Rust نه تنها شدنیه، بلکه خیلی هم تمیز و ایمن انجام می‌شه. کتابخونه‌ی معروف serde که اسمش از “serialize/deserialize” میاد، یکی از ستون‌های اصلی کار با داده‌های ساخت‌یافته در Rust هست.
      با استفاده از serde و مشتق‌گیری (#[derive(Serialize, Deserialize)]) می‌تونید ساختارهای Rust رو خیلی راحت به JSON تبدیل کنید یا از JSON بخونید. اگر با TypeScript یا Python آشنا باشید، خیلی سریع جا می‌افتد.
      برای مثال، اگه از axum یا actix-web استفاده کنید، فقط با یه annotation ساده (Json) توی handlerها می‌تونید داده‌ها رو بگیرید یا ارسال کنید. هیچ نیازی به پارس‌کردن دستی نیست (مگر در موارد خیلی خاص).
      خلاصه که نه تنها راحته، بلکه کامپایلر هم مراقبه که چیزی اشتباه serialize یا deserialize نشه. و این یعنی، باز هم، کمتر باگ و کمتر غافلگیری در زمان اجرا!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *