Serverless على Rust: عندما تكون كل ملي ثانية مهمة
\n\nهل سبق لك أن انتظرت تشغيل AWS Lambda لمدة 3-4 ثوانٍ كاملة؟ إذا كنت قد عملت مع Python أو Node.js في بيئة serverless، فأنت تعرف هذا الألم — البدء البارد. تخيل الآن: وظيفتك تبدأ في غضون 50-100 ملي ثانية، وتستهلك ذاكرة أقل بعشر مرات، ووزن الملف الثنائي 5 ميغابايت فقط. مرحباً بك في عالم وظائف serverless على Rust.
\n\nلم يقتحم Rust عالم serverless من فراغ. إنها لغة تمنحك التحكم في الذاكرة بدون جامع قمامة، وتُترجم إلى كود أصلي، وهي مثالية للحوسبة الطرفية. في PythonLib نحب Python، ولكن عندما يتعلق الأمر بالسرعة والتكلفة — خاصة تحت الأحمال العالية — يصبح Rust قاتلاً.
\n\nفي هذه المقالة سنتناول:
\n- \n
- لماذا Rust هي أفضل لغة لـ serverless (تنبيه: ليس فقط بسبب السرعة) \n
- كيفية كتابة ونشر AWS Lambda على Rust \n
- البدائل: Cloudflare Workers و Vercel Edge Functions \n
- معايير أداء البدء البارد Rust مقابل Python \n
هل أنت مستعد؟ لنبدأ.
\n\nلماذا Rust لـ Serverless ليست ضجة، بل رياضيات
\n\nلننتقل مباشرة إلى الأرقام. متوسط البدء البارد لـ AWS Lambda على Python هو 400-800 ملي ثانية (مع تحميل التبعيات). على Node.js — 200-400 ملي ثانية. على Rust — 30-100 ملي ثانية. لماذا هذا الفرق؟
\n\n- \n
- لا يوجد مفسر أو JIT. Rust يُترجم إلى كود آلي. Lambda ببساطة تحمّل الملف الثنائي — وينتهي الأمر. \n
- حجم ضئيل. حتى مع tokio و serde، وزن الملف الثنائي 5-15 ميغابايت (الملف المضغوط zip — 2-4 ميغابايت). Python مع numpy أو pandas — 50-200 ميغابايت. \n
- توفير في الذاكرة. وظائف Rust تستهلك 20-50 ميغابايت مقابل 128-256 ميغابايت لـ Python. على 10 ملايين طلب، الفرق في الفاتورة — مئات الدولارات. \n
لكن هناك فارق: الكتابة على Rust أصعب. تحتاج إلى فهم الملكية، الأعمار، و async. ومع ذلك، إذا كانت Lambda الخاصة بك هي خدمة مصغرة حرجة مع RPS > 1000، فإن Rust تؤتي ثمارها بسرعة.
\n\nتطبيق عملي: كتابة AWS Lambda على Rust
\n\nالخطوة 1: تثبيت الأدوات
\n\nستحتاج إلى:
\n- \n
- Rust (rustup) \n
- cargo-lambda — أداة للبناء لـ AWS \n
- Docker (للبناء تحت Linux، إذا كان لديك macOS/Windows) \n
# تثبيت cargo-lambda\ncargo install cargo-lambda\n\n# إنشاء مشروع جديد\ncargo lambda new my-rust-lambda\ncd my-rust-lambda\n\nالخطوة 2: كود الوظيفة
\n\nافتح src/main.rs. القالب القياسي يحتوي بالفعل على هيكل أساسي. دعنا نكتب شيئاً مفيداً — API يستقبل JSON باسم ويعيد تحية.
use lambda_runtime::{run, service_fn, Error, LambdaEvent};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize)]\nstruct Request {\n name: String,\n}\n\n#[derive(Serialize)]\nstruct Response {\n message: String,\n timestamp: u64,\n}\n\nasync fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> {\n let request = event.payload;\n let timestamp = std::time::SystemTime::now()\n .duration_since(std::time::UNIX_EPOCH)\n .unwrap()\n .as_secs();\n\n Ok(Response {\n message: format!("مرحباً، {}! أنت في PythonLib، لكننا على Rust 🦀", request.name),\n timestamp,\n })\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n tracing_subscriber::fmt()\n .with_max_level(tracing::Level::INFO)\n .init();\n\n run(service_fn(handler)).await\n}\n\nالخطوة 3: البناء والنشر
\n\n# البناء تحت Linux (لـ Lambda)\ncargo lambda build --release\n\n# النشر (تحتاج إلى بيانات اعتماد AWS)\ncargo lambda deploy --iam-role arn:aws:iam::YOUR_ACCOUNT:role/lambda-execution-role\n\nتم! الآن لديك Lambda على Rust تعمل أسرع بـ 5-10 مرات من نظيرتها في Python.
\n\