لماذا C++ في عالم Serverless؟
\n\nعندما تسمع "serverless"، أول ما يتبادر إلى الذهن هو JavaScript أو Python أو Go. لكن ماذا لو أخبرتك أنه يمكن تشغيل C++ في AWS Lambda وGoogle Cloud Functions وحتى على بيئات تشغيل مخصصة؟ وهذا ليس مجرد اختراق، بل سيناريو منطقي تمامًا للمهام التي تكون فيها كل ملي ثانية مهمة.
\n\nC++ في serverless يتعلق بالسرعة وبدء التشغيل البارد. بينما تقوم دالة Python بتحميل المفسر والتبعيات، يكون C++ قد أنهى التنفيذ بالفعل. لكن هناك تفاصيل: ستحتاج إلى تجميع ملف ثنائي لنظام Linux، وتعبئته في ملف ZIP، وتحديد بيئة تشغيل مخصصة. يبدو الأمر معقدًا؟ في الواقع - لا. دعنا نفهم الأمر.
\n\nكيف يعمل Serverless لـ C++؟
\n\nالأمر هو أن موفري الخدمات السحابية لا يدعمون اللغات المترجمة بشكل افتراضي. على سبيل المثال، AWS Lambda يدعم رسميًا فقط Python وNode.js وJava وGo و.NET وRuby. لكن Lambda لديها آلية Custom Runtime - يمكنك تقديم أي ملف ثنائي يتواصل مع Lambda Runtime API عبر HTTP.
\n\nالمخطط بسيط:
\n- \n
- تقوم بتجميع كود C++ لنظام Amazon Linux 2 (أو بيئة متوافقة). \n
- تعبئة الملف القابل للتنفيذ مع سكريبت
bootstrap(أو الملف الثنائي نفسه، معاد تسميته إلىbootstrap). \n - تحميل ملف ZIP إلى Lambda وتحديد "Provide your own bootstrap". \n
يمكن فعل الشيء نفسه مع Google Cloud Functions (عبر Cloud Run أو Knative) ومع Azure Functions (عبر صورة Docker).
\n\nبناء دالة Lambda بسيطة بلغة C++
\n\nلنكتب دالة تستقبل JSON برقمين وتعيد مجموعهما. هذا كلاسيكي، لكن بلغة C++.
\n\n// main.cpp\n#include <iostream>\n#include <string>\n#include <nlohmann/json.hpp>\n\nusing json = nlohmann::json;\n\nint main() {\n // قراءة الحدث من stdin (Lambda ترسله هكذا)\n std::string input;\n std::getline(std::cin, input);\n\n auto event = json::parse(input);\n\n int a = event["a"];\n int b = event["b"];\n int sum = a + b;\n\n json result;\n result["statusCode"] = 200;\n result["body"] = std::to_string(sum);\n\n // الإخراج إلى stdout - هذا هو رد Lambda\n std::cout << result.dump() << std::endl;\n\n return 0;\n}\n\n\nللتجميع، سنحتاج إلى مترجم g++ ومكتبة nlohmann/json (تنزيل ملف الرأس). نقوم بالتجميع بشكل ثابت، لتجنب حمل ملفات .so:
g++ -std=c++17 -static -O2 main.cpp -o bootstrap\n\n\nالآن نقوم بإنشاء أرشيف ZIP بملف واحد bootstrap ونرفعه إلى Lambda. هذا كل شيء! الدالة جاهزة.
معالجة الأخطاء وتسجيل السجلات
\n\nفي مشروع حقيقي، تحتاج إلى معالجة أخطاء تحليل JSON بشكل صحيح وإرجاع رد مفهوم. تتوقع AWS Lambda أن ينهي ملفك الثنائي برمز 0 في حالة النجاح وبرمز غير صفري عند الخطأ. يمكن كتابة السجلات في stderr - ستظهر في CloudWatch.
if (!event.contains("a") || !event.contains("b")) {\n std::cerr << "Missing parameters" << std::endl;\n json error;\n error["statusCode"] = 400;\n error["body"] = "Bad Request";\n std::cout << error.dump() << std::endl;\n return 1;\n}\n\n\nبدائل AWS Lambda لـ C++
\n\nلا تريد عناء استخدام Custom Runtime؟ هناك خيارات أخرى.
\n\nGoogle Cloud Run + Knative
\n\nيمكنك تعبئة تطبيق C++ في صورة Docker وتشغيله على Cloud Run. هذا ليس "دالة" تمامًا، بل هو serverless قائم على الحاويات، لكنه لـ C++ هو الطريق الأسهل. سيكون بدء التشغيل البارد أطول (بالثواني)، لكن لا توجد قيود على بيئة التشغيل.
\n\nAzure Functions مع Docker
\n\nبالمثل - تستخدم Docker وأي صورة تحتوي على بيئة تشغيل C++. تدعم Azure المعالجات المخصصة عبر custom handlers.