لماذا Rust هي خطوتك التالية في الميكروسيرفيسات؟
\n\nلطالما كان عالم الميكروسيرفيسات مقسماً بين Java (مع Spring Boot الخاص بها)، Python (FastAPI، Django) و Go. لكن في العامين الماضيين، أصبح صوت Rust يُسمع أكثر فأكثر. لماذا؟ لأن Rust تقدم ما كان يبدو سابقاً بعيد المنال: أداء C++ وأمان الذاكرة - بدون جامع القمامة.
\n\nإذا كنت تكتب بلغة Python، فأنت معتاد على سرعة التطوير. ولكن عندما يزداد الحمل، تبدأ Python في "التباطؤ". تحل Rust هذه المشكلة بشكل جذري: يمكن لميكروسيرفيس واحد بلغة Rust أن يحل محل 3-4 خدمات بلغة Python من حيث الأداء. وفي الوقت نفسه، لا ينهار الكود في وقت التشغيل مع NullPointerException.
\n\nفي هذه المقالة، لن نتنظّر. سنقوم بكتابة ميكروسيرفيس بلغة Rust من الصفر. سترى أن الأمر ليس مخيفاً، بل هو ممتع للغاية.
\n\nتجهيز البيئة: ما تحتاج إلى تثبيته
\n\nقبل كتابة الكود، دعنا نتأكد من أن لديك كل ما يلزم. إذا كنت مبتدئاً في Rust - لا تقلق، التثبيت يستغرق دقيقتين.
\n\n1. تثبيت Rust
\nأسهل طريقة هي من خلال المثبت الرسمي rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\nبعد التثبيت، تحقق من الإصدار:
\n\nrustc --version\ncargo --version\n\n2. اختيار المحرر
\nأوصي باستخدام VS Code مع إضافة rust-analyzer. سيمنحك هذا الإكمال التلقائي، وإبراز الأخطاء، وإعادة الهيكلة "خارج الصندوق".
3. Docker (للحاويات)
\nتعيش الميكروسيرفيسات عادةً في حاويات. قم بتثبيت Docker Desktop أو Docker Engine. سنقوم ببناء الصورة في نهاية المقالة.
\n\nاختيار الإطار: Actix-web مقابل Axum مقابل Rocket
\n\nفي عالم Rust، هناك ثلاثة أطر رئيسية لخوادم HTTP. إليك مقارنة موجزة بينها:
\n\n- \n
- Actix-web - الأسرع (حتى مليون طلب/ثانية). ناضج، مع العديد من الأمثلة. مثالي للإنتاج. \n
- Axum - حديث، من مبتكري Tokio. يتكامل بشكل أفضل مع النظام البيئي غير المتزامن (async). \n
- Rocket - الأكثر "ودية" من حيث بناء الجملة، لكنه أبطأ في التحديث. \n
في هذه المقالة، سنستخدم Actix-web، لأنه تم اختباره على مر السنين وله أكبر مجتمع. ولكن إذا كنت تريد مجموعة "عصرية" - فلا تتردد في استخدام Axum.
\n\nأول ميكروسيرفيس: خدمة تقصير الروابط
\n\nلكي لا نكون نظريين، سنكتب ميكروسيرفيس حقيقي - url-shortener. سيقبل عنوان URL طويلاً ويعيد عنواناً قصيراً.
\n\nالخطوة 1. إنشاء المشروع
\ncargo new url-shortener\ncd url-shortener\n\nالخطوة 2. إضافة التبعيات
\nافتح Cargo.toml وأضف:
[dependencies]\nactix-web = "4"\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\nuuid = { version = "1", features = ["v4"] }\ntokio = { version = "1", features = ["full"] }\n\nالخطوة 3. كتابة الكود
\nاستبدل محتوى src/main.rs بالكود التالي:
use actix_web::{web, App, HttpServer, HttpResponse, Responder};\nuse serde::{Deserialize, Serialize};\nuse std::sync::Mutex;\nuse uuid::Uuid;\n\n// هيكل لتخزين الروابط في الذاكرة\nstruct AppState {\n links: Mutex>,\n}\n\n#[derive(Serialize, Deserialize, Clone)]\nstruct Link {\n id: String,\n url: String,\n}\n\n#[derive(Deserialize)]\nstruct CreateLinkRequest {\n url: String,\n}\n\n// POST /shorten — ينشئ رابطاً قصيراً\nasync fn shorten(data: web::Data<AppState>, body: web::Json<CreateLinkRequest>) -> impl Responder {\n let new_link = Link {\n id: Uuid::new_v4().to_string()[..8].to_string(), // نأخذ أول 8 أحرف من UUID\n url: body.url.clone(),\n };\n\n let mut links = data.lin