لماذا Serverless ليس مجرد ضجة، بل إنقاذ لمحفظتك وأعصابك
\n\nتخيل: لقد كتبت API رائع بلغة C#، وقمت بتشغيله على جهاز افتراضي، وهو معطل 23 ساعة يوميًا. أنت تدفع ثمن الهواء. مألوف؟ إذا كان الأمر كذلك، فإن دوال serverless بلغة C# هي طوق النجاة لك. الحوسبة بدون خادم (أو Function-as-a-Service) تسمح لك بتنفيذ الكود فقط عندما يكون مطلوبًا حقًا. لا استئجار خوادم، لا إعداد يدوي لـ CI/CD للبنية التحتية، لا صداع مع التوسع.
\n\nفي هذه المقالة، سنشرح كيفية كتابة دوال serverless بلغة C# لـ AWS Lambda و Azure Functions، وسنقارن بينهما، ونكتب كودًا حقيقيًا، ونفهم لماذا هذا هو الخيار الأفضل للخدمات المصغرة، ومعالجات الأحداث، والواجهة الخلفية لتطبيقات الهاتف المحمول. ونعم، سيكون هناك الكثير من الكود — بدون حشو.
\n\nAWS Lambda و C#: كيف نجمع بين أداتين قويتين
\n\nAWS Lambda C# هو على الأرجح الخيار الأكثر شيوعًا لمطوري .NET الذين يعملون مع Amazon Web Services. تدعم Lambda .NET Core 3.1، .NET 6، .NET 8 وحتى .NET 9 (تحقق من التحديثات وقت القراءة). الميزة الرئيسية هي أنك تكتب بلغة C# المألوفة، و AWS نفسها تهتم ببيئة التشغيل.
\n\nإنشاء أول دالة Lambda بلغة C#
\n\nللبدء، قم بتثبيت AWS Toolkit لـ Visual Studio أو استخدم .NET CLI. لننشئ مشروعًا باستخدام قالب "AWS Lambda Project".
\n\ndotnet new lambda.EmptyFunction --name HelloWorldFunction\ncd HelloWorldFunction\ndotnet add package Amazon.Lambda.Core\ndotnet add package Amazon.Lambda.Serialization.SystemTextJson\n\nالآن لنكتب الدالة نفسها. مثال كلاسيكي — معالجة طلب API Gateway وإرجاع JSON.
\n\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.Serialization.SystemTextJson;\n\n[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]\n\npublic class Function\n{\n public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest input, ILambdaContext context)\n {\n var message = $"مرحبًا بالعالم! طلبك: {input.Body ?? "فارغ"}";\n context.Logger.LogInformation("تم استدعاء دالة Lambda");\n\n return new APIGatewayProxyResponse\n {\n StatusCode = 200,\n Body = JsonSerializer.Serialize(new { message, timestamp = DateTime.UtcNow }),\n Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }\n };\n }\n}\n\nلاحظ: الكود غير متزامن، يستخدم التسلسل المدمج لـ JSON والتسجيل. هذا هو الحد الأدنى من المنتج القابل للتطبيق والذي يمكنه العمل تحت الضغط.
\n\nلماذا تتفوق AWS Lambda لـ C#؟
\n- \n
- Cold start: قامت AWS بتحسين تشغيل دوال .NET عبر SnapStart — الآن يستغرق البدء أقل من 200 مللي ثانية. \n
- التكامل: تعمل فورًا مع S3، DynamoDB، SQS، API Gateway. \n
- المراقبة: CloudWatch يجمع السجلات والمقاييس والأخطاء. \n
Azure Functions لـ C#: بديل جدير من Microsoft
\n\nإذا كان مشروعك مرتبطًا بالفعل بنظام Microsoft البيئي (Azure DevOps، Active Directory، SQL Server)، فإن Azure Functions C# قد تكون أكثر ملاءمة. فهي تدعم ليس فقط العملية المعزولة (isolated process)، ولكن أيضًا النموذج داخل العملية.
\n\nمثال لدالة بلغة C# لـ Azure
\n\nلننشئ مشغل HTTP باستخدام Azure Functions Core Tools:
\n\nfunc init MyFunctionApp --dotnet-isolated\ncd MyFunctionApp\nfunc new --name HttpExample --template "HTTP trigger"\n\nكود الدالة:
\n\nusing Microsoft.Azure.Functions.Worker;\nusing Microsoft.Extensions.Logging;\n\npublic class HttpExample\n{\n private readonly ILogger<HttpExample> _logger;\n\n public HttpExample(ILogger<HttpExample> logger)\n {\n _logger