وظائف Serverless بلغة C++: AWS Lambda من الألف إلى الياء
\n\nأصبحت بنية Serverless جزءًا لا يتجزأ من عالم التطوير الحديث، حيث توفر قابلية التوسع والدفع فقط مقابل الاستخدام الفعلي للموارد. يربط معظم المطورين مفهوم serverless بلغات Python أو Node.js أو Java، ولكن لغة C++ هي لغة قوية وعالية الأداء يمكن استخدامها أيضًا لإنشاء وظائف Lambda في AWS. في هذه المقالة، سنستعرض الدورة الكاملة: من إعداد البيئة إلى نشر وتصحيح أخطاء وظيفة C++ في AWS Lambda.
\n\nلماذا تختار C++ لـ AWS Lambda؟
\n\nتوفر لغة C++ مزايا فريدة لسيناريوهات serverless:
\n- \n
- أقصى أداء: يتم ترجمة C++ إلى كود آلي (machine code)، مما يعطي أقل وقت تنفيذ وأقل زمن استجابة (latency). هذا أمر بالغ الأهمية للتداول عالي التردد (high-frequency trading)، معالجة الفيديو في الوقت الفعلي، أو الحسابات الرياضية المعقدة. \n
- توفير الموارد: تستهلك وظائف C++ ذاكرة ووحدة معالجة مركزية (CPU) أقل مقارنة باللغات المفسرة، مما يسمح بتقليل التكلفة من خلال عدد أقل من الاستدعاءات أو استخدام خطط أسعار أرخص. \n
- العمل مع الكود القديم (legacy): يمكنك بسهولة دمج مكتبات وخوارزميات C++ الحالية دون الحاجة إلى إعادة كتابتها بلغة أخرى. \n
إعداد البيئة و AWS SDK للغة C++
\n\nقبل كتابة الكود، يجب إعداد بيئة العمل. توفر AWS حزمة AWS SDK للغة C++ رسمية، والتي تسهل التفاعل مع الخدمات (مثل S3 و DynamoDB وغيرها).
\n\nتثبيت التبعيات
\nلنظام Linux (Amazon Linux 2 أو Ubuntu) استخدم مدير الحزم:
\nsudo yum install cmake gcc-c++ libcurl-devel openssl-devel\n# أو لنظام Ubuntu:\nsudo apt-get install cmake g++ libcurl4-openssl-dev libssl-dev\n\nبناء AWS SDK
\nقم بتنزيل وبناء SDK:
\ngit clone https://github.com/aws/aws-sdk-cpp.git\ncd aws-sdk-cpp\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_ONLY="lambda"\nmake -j$(nproc)\nsudo make install\n\nالعلامة -DBUILD_ONLY="lambda" تسرّع عملية البناء من خلال تضمين الوحدات الضرورية فقط.
كتابة دالة Lambda بلغة C++
\n\nدالة Lambda بلغة C++ هي برنامج عادي يتم ترجمته إلى ملف تنفيذي ويستخدم واجهة خاصة تسمى Runtime API. تتوقع AWS أن يتم تشغيل ملفك الثنائي (binary) وأن يستمع للطلبات على خادم HTTP محلي.
\n\nهيكل المشروع
\nلننشئ مشروعًا بسيطًا:
\nmy-lambda-cpp/\n├── CMakeLists.txt\n└── src/\n └── main.cpp\n\nملف CMakeLists.txt
\ncmake_minimum_required(VERSION 3.10)\nproject(my-lambda)\n\nset(CMAKE_CXX_STANDARD 17)\n\nfind_package(AWSSDK REQUIRED COMPONENTS lambda)\n\nadd_executable(handler src/main.cpp)\ntarget_link_libraries(handler ${AWSSDK_LINK_LIBRARIES})\n\nالكود الرئيسي (main.cpp)
\nفي C++، تستخدم Lambda Custom Runtime. يجب علينا تنفيذ حلقة معالجة الأحداث:
\n#include <iostream>\n#include <aws/lambda-runtime/runtime.h>\n\nusing namespace aws::lambda_runtime;\n\n// دالة المعالج\ninvocation_response my_handler(invocation_request const& req) {\n // تسجيل الحدث الوارد\n std::cout << "Received event: " << req.payload << std::endl;\n\n // معالجة بسيطة: إرجاع JSON\n std::string response = R"({"statusCode": 200, "body": "Hello from C++ Lambda!"})";\n return invocation_response::success(response, "application/json");\n}\n\nint main() {\n run_handler(my_handler);\n return 0;\n}\n\nهام: تقوم run_handler بتشغيل حلقة لا نهائية تستمع إلى المنفذ 9001 (المنفذ القياسي لـ Runtime API).
بناء ونشر الدالة
\n\nيجب أن يتم البناء في بيئة متوافقة مع Amazon Linux، وإلا فلن يعمل الملف الثنائي