مقدمة: لماذا Rust هو الخيار الأمثل للميكروسيرفيسات
\n\nفي عالم التطوير الحديث، أصبحت هندسة الميكروسيرفيسات المعيار الفعلي لبناء أنظمة قابلة للتوسع، ومتسامحة مع الأعطال، وسهلة الصيانة. تقليديًا، كان يتم اختيار Go أو Java (Spring Boot) أو Node.js للميكروسيرفيسات. ومع ذلك، في السنوات الأخيرة، رسخت لغة Rust مكانتها بقوة في هذا المجال. لماذا؟
\n\nRust تقدم مزيجًا فريدًا من أداء لغة C++ وأمان الذاكرة الذي يتم ضمانه في مرحلة الترجمة. وهذا يعني:
\n- \n
- تكلفة صفرية للتجريدات: الهياكل عالية المستوى لا تضحي بالأداء. \n
- أمان الذاكرة بدون جامع قمامة: زمن استجابة (latency) يمكن التنبؤ به، وهو أمر بالغ الأهمية للأنظمة عالية التحميل. \n
- حجم ملف ثنائي صغير وبدء تشغيل سريع: مثالي للحاويات والتنسيق (Kubernetes).
- نظام بيئي غني: أطر عمل ومكتبات للعمل مع HTTP و gRPC وقواعد البيانات وقوائم الانتظار.
في هذه المقالة، سننتقل من تصميم الهندسة إلى كتابة ونشر ميكروسيرفيس بلغة Rust. ستتعلم كيفية استخدام المكتبات الرئيسية مثل actix-web و tokio و tonic، وكيفية تجنب الأخطاء الشائعة للمبتدئين.
1. التصميم واختيار مجموعة التقنيات
\n\nقبل كتابة الكود، يجب تحديد الهندسة المعمارية. بالنسبة لميكروسيرفيس بلغة Rust، تبدو المجموعة النموذجية كالتالي:
\n\n1.1. إطار العمل للويب: Actix-Web مقابل Axum مقابل Warp
\n- \n
- Actix-Web: الإطار الأكثر نضجًا والأعلى أداءً. يوفر نظامًا قويًا للوسائط (middleware)، و WebSocket، ودعم HTTP/2. الخيار الأفضل للمشاريع عالية التحميل.
- Axum: إطار حديث من فريق Tokio. يستخدم tower (Service Trait)، مما يجعله سهل التوسع ومتوافقًا مع عدد كبير من الوسائط.
- Warp: تصريحي وبسيط. مناسب تمامًا لواجهات API البسيطة.
في مثالنا، سنستخدم Actix-Web باعتباره الخيار الأكثر شيوعًا والمُختبر.
\n\n1.2. وقت التشغيل غير المتزامن: Tokio
\nTokio هو المعيار الفعلي للبرمجة غير المتزامنة في Rust. يوفر جدولة متعددة الخيوط، ومؤقتات، وقنوات، والعمل مع مآخذ الشبكة. سيتم كتابة كود الميكروسيرفيس بالكامل باستخدام async/await على أساس Tokio.
1.3. التفاعل بين الخدمات: gRPC مقابل REST
\n- \n
- REST (JSON): أسهل في التصحيح، ولكنه أبطأ بسبب التسلسل.
- gRPC (Protobuf): أسرع، كتابة صارمة، دعم البث. بالنسبة لـ Rust، استخدم crate
tonic.
بالنسبة للاستدعاءات الداخلية بين الميكروسيرفيسات، يُوصى باستخدام gRPC. بالنسبة لواجهات API الخارجية، يُوصى باستخدام REST.
\n\n1.4. قواعد البيانات
\n- \n
- SQL:
sqlx(غير متزامن، مع التحقق من الاستعلامات في مرحلة الترجمة) أوdiesel(ORM). - NoSQL:
mongodb،redis-rsلـ Redis.
2. التطبيق العملي: كتابة ميكروسيرفيس بلغة Rust مع Actix-Web
\n\nلنقم بإنشاء ميكروسيرفيس بسيط لإدارة المستخدمين (User Service). سيوفر واجهة REST API ويخزن البيانات في PostgreSQL.
\n\n2.1. تهيئة المشروع
\ncargo new user-service\ncd user-service\n\nسنضيف التبعيات إلى Cargo.toml:
[dependencies]\nactix-web = "4"\nactix-rt = "2"\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\ntokio = { version = "1", features = ["full"] }\nsqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }\nuuid = { version = "1", features = ["v4"] }\ndotenv = "0.15"\n\n