Serverless على Swift: عندما يذهب مطور التطبيقات المحمولة إلى السحابة
\n\nأنت تكتب بلغة Swift لنظام iOS أو macOS أو watchOS. كودك جميل وآمن وسريع. لكن عاجلاً أم آجلاً يطرح السؤال: ماذا لو نقلت منطق الباك إند إلى نفس اللغة؟ لا تخلق كيانات جديدة مع Python أو Node.js أو Go، بل فقط اكتب دالة سحابية بلغة Swift الأصلية؟
\n\nالخبر السار: هذا أصبح حقيقة واقعة بالفعل. دوال Serverless بلغة Swift تعمل على AWS Lambda و Google Cloud Run وحتى Vercel. نعم، النظام البيئي ليس ناضجًا مثل JavaScript، لكنه بالنسبة لمطوري التطبيقات المحمولة الذين يريدون التحكم في كل من العميل والخادم، فهو منجم ذهب.
\n\nفي هذه المقالة، سنشرح كيفية تشغيل Swift في بيئة serverless، وما هي العقبات المحتملة، وأين تجد القوالب الجاهزة. هيا بنا.
\n\nلماذا Swift بدلاً من Python أو Node.js؟
\n\nلنكن صادقين: إذا كنت بحاجة إلى كتابة محلل (parser) سريع أو API بسيط، فإن Python أو Node.js ستكون أكثر ملاءمة. لكن Swift لديه أوراق رابحة تفوقها في أحمال الإنتاج:
\n\n- \n
- الأداء — يتم تجميع Swift إلى كود أصلي (native code). على AWS Lambda، يعطي هذا زيادة في السرعة تصل إلى 2-3 مرات مقارنة بـ Node.js على نفس ميزانيات الذاكرة. \n
- الكتابة الآمنة (Typing) والأمان — Optionals، كتابة صارمة، عدم وجود كائنات nil. الأخطاء التي ستظهر في Python أثناء وقت التشغيل، سيتم اكتشافها في Swift أثناء مرحلة التجميع. \n
- حزمة تقنية موحدة — إذا كنت مطور iOS، فلن تحتاج إلى تعلم لغة ثانية للباك إند. قاعدة كود واحدة، هياكل بيانات واحدة، منطق واحد. \n
- النظام البيئي لـ Vapor — إطار العمل الأكثر شيوعًا لـ Swift على الخادم، والذي يتكيف بشكل ممتاز مع بيئة serverless. \n
بالطبع، هناك سلبيات: حجم الملف الثنائي (حوالي 15-30 ميجابايت مقابل 500 كيلوبايت لـ Node.js) وعدد أقل من المكتبات الجاهزة. لكن بالنسبة للخدمات المصغرة (microservices) وبوابات API، هذا ليس بالغ الأهمية.
\n\nالأساس التقني: كيف يعمل Swift على AWS Lambda
\n\nتدعم Amazon رسميًا Swift من خلال Custom Runtime. أنت لا تستخدم بيئة التشغيل المدمجة لـ Node.js أو Python — بل تقوم بتغليف ملفك التنفيذي في ملف ZIP وتحميله إلى Lambda.
\n\nإليك كيف يبدو ذلك على مستوى البنية:
\n\n- \n
- يقوم Lambda باستدعاء ملفك الثنائي كأمر shell. \n
- يقرأ كودك الحدث من stdin (JSON)، ويعالجه، ويكتب الرد إلى stdout. \n
- يتم استخدام Runtime API (عبر HTTP) لإرسال التقارير والأخطاء. \n
يبدو الأمر معقدًا؟ عمليًا، نستخدم القالب الجاهز Swift AWS Lambda Runtime من Apple. وهو يتولى كل المهام الروتينية.
\n\nمثال: معالج Lambda بسيط بلغة Swift
\n\nلننشئ دالة تستقبل اسم مستخدم وتعيد تحية. هذا هو الكلاسيكي hello-world لـ serverless.
\n\n// استيراد المكتبة من Apple\nimport AWSLambdaRuntime\nimport AWSLambdaEvents\n\n// هياكل للإدخال والإخراج\nstruct GreetingRequest: Codable {\n let name: String\n}\n\nstruct GreetingResponse: Codable {\n let message: String\n}\n\n// المعالج الرئيسي\nLambda.run { (context, request: GreetingRequest, callback: @escaping (Result<GreetingResponse, Error>) -> ()) in\n let response = GreetingResponse(message: "مرحبًا، \\(request.name)! أهلاً بك في serverless على Swift.")\n callback(.success(response))\n}\n\n\nيتم تجميع هذا الكود إلى ملف ثنائي. تقوم بتغليفه في ملف ZIP مع المكتبات (الربط الثابت) وتحميله إلى AWS Lambda. سيجد Runtime نقطة الدخول بنفسه.
\n\nهام: للإنتاج، استخدم صورة Docker مبنية على Amazon Linux 2، وإلا فقد تواجه مشاكل مع glibc.
\n\nالبناء والنشر: خطة خطوة بخطوة
\n\nلتجنب إضاعة الوقت في التلاعبات المعقدة، استخدم الأداة الجاهزة aws-lambda-swift-sam. وهي طبقة إضافية فوق AWS SAM (Serverless Application Model).
\n\n- \n
- قم بتثبيت Swift 5.7+