مقدمة: لماذا C++ في Serverless؟
يرتبط عالم الحوسبة بدون خادم (Serverless) بقوة بـ JavaScript (Node.js) أو Python أو Java. ومع ذلك، بالنسبة للمهام الحساسة للأداء واستهلاك الذاكرة، تصبح C++ مرشحًا مثاليًا. تدعم AWS Lambda لغة C++ من خلال Native Runtime، مما يسمح بتشغيل الملفات الثنائية بأقل تكاليف إضافية.
في هذه المقالة، سنشرح كيفية كتابة وتجميع ونشر دالة C++ على AWS Lambda. ستتعرف على مزايا C++ في بنية Serverless، وإعداد البيئة، وتحسين البداية الباردة (Cold Start).
1. مزايا C++ مقارنة بـ Python و Node.js
الأداء والبداية الباردة
العيب الرئيسي للغات المفسرة هو التأخير عند البداية الباردة. يمكن أن تستغرق حاوية Lambda مع Python 200-500 مللي ثانية للتهيئة، بينما مع C++ تكون أقل من 50 مللي ثانية. هذا أمر بالغ الأهمية لواجهات API ذات متطلبات زمن استجابة عالية.
- استهلاك منخفض للذاكرة: يشغل الملف الثنائي C++ حوالي 1-3 ميجابايت مقابل 20+ ميجابايت لـ Node.js مع التبعيات.
- وصول مباشر لموارد النظام: العمل مع المقابس (Sockets) والملفات والذاكرة بدون طبقة VM وسيطة.
- توفير التكاليف: بفضل التنفيذ السريع، تدفع أقل مقابل ميلي ثانية من العمل.
2. إعداد البيئة لـ C++ على AWS Lambda
لتجميع كود C++ لـ Lambda، يجب استخدام Amazon Linux 2 (أو صورة متوافقة). الطريقة الموصى بها هي استخدام حاوية Docker مع الصورة الرسمية لـ Lambda.
المتطلبات
- CMake ≥ 3.15
- GCC 7.3+ أو Clang 7+
- AWS SDK for C++ (اختياري، للعمل مع S3/DynamoDB)
- Docker (للبناء في بيئة مطابقة لـ Lambda)
ملف Dockerfile أساسي للبناء
FROM public.ecr.aws/lambda/provided:al2
# تثبيت أدوات البناءRUN yum install -y gcc-c++ cmake3 make
# نسخ الملفات المصدريةCOPY . /codeWORKDIR /code/build
# بناء ملف ثنائي ثابتRUN cmake3 .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-static-libstdc++ -static-libgcc" \ && make -j$(nproc)
# نسخ النتيجة إلى دليل LambdaRUN cp handler /var/task/bootstrapCMD ["handler"]3. كتابة دالة Lambda بلغة C++
على عكس Python حيث يكون المعالج (Handler) دالة، في C++ نقوم بإنشاء ملف تنفيذي تقوم Lambda بتشغيله كعملية. يتم تمرير بيانات الإدخال عبر stdin، ويتم إخراج النتيجة إلى stdout.
مثال بسيط: معالجة JSON
#include <iostream>#include <string>#include <nlohmann/json.hpp> // مكتبة للعمل مع JSON
using json = nlohmann::json;
int main() { // قراءة كل stdin (JSON المدخل من Lambda) std::string input; std::getline(std::cin, input);
try { auto event = json::parse(input);
// استخراج المعاملات std::string name = event.value("name", "World"); int number = event.value("number", 0);
// تكوين الرد json response = { {"message", "Hello, " + name + "!"}, {"computed", number * 2}, {"language", "C++"} };
std::cout << response.dump() << std::endl; return 0; } catch (const std::exception& e) { std::cerr << "{\\"error\\":\\"" << e.what() << "\\"}" << std::endl; return 1; }}هيكل ملف CMakeLists.txt
cmake_minimum_required(VERSION 3.15)project(lambda-handler)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# الربط الثابت لضمان قابلية النقلset(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc")
# تضمين nlohmann/json (vcpkg أو fetch)find_package(nlohmann_json REQUIRED)
add_executable(handler main.cpp)target_link_librar