دوال Serverless بلغة C++: AWS Lambda - دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا 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

المدونات

توصيات الكتب