Serverless بلغة Kotlin: AWS Lambda والنظائر — نكتب كودًا بدون خادم يعمل
\nفي الماضي، كانت كتابة الواجهة الخلفية مرادفًا لإعداد الخوادم، وتهيئة Nginx، وليالٍ بلا نوم مع مراقبة الحمل. اليوم الأمر مختلف تمامًا. Serverless ليس خيالًا علميًا، بل واقع يسمح لك بنسيان العتاد والتركيز على منطق التطبيق. وإذا كنت تكتب بلغة Kotlin، فستحصل على كود أنيق وآمن وسريع يتناسب تمامًا مع البنية التحتية بدون خادم.
\nفي هذه المقالة، سنشرح كيفية إنشاء دوال serverless بلغة Kotlin، وما هي أفضل مزودي الخدمات السحابية، وكيف لا تغرق في تفاصيل التهيئة. هيا بنا!
\n\nما هو Serverless ولماذا Kotlin هو الخيار الأمثل
\nServerless (أو الحوسبة بدون خادم) هو نموذج حوسبة سحابية حيث تكتب الكود ويتولى المزود مسؤولية البنية التحتية. أنت لا تدفع مقابل خادم خامل - فقط مقابل وقت تنفيذ الدالة. يبدو كحلم؟ بالنسبة لـ Kotlin، هذا مهم بشكل خاص.
\nلماذا Kotlin بالتحديد؟ أولاً، يتم تجميعه إلى bytecode لـ JVM، مما يوفر دعمًا أصليًا على AWS Lambda وGoogle Cloud Functions وAzure Functions. ثانيًا، Kotlin هي لغة حديثة بتكلفة صفرية للتجريدات، و lambdas، و coroutines. ثالثًا، تركيبها اللغوي يسمح بكتابة كود موجز يسهل صيانته.
\nالمزايا الرئيسية لـ دوال serverless بلغة Kotlin:
\n- \n
- توفير التكاليف — تدفع فقط مقابل التنفيذ الفعلي للكود. \n
- التوسع — السحابة تقرر بنفسها عدد النسخ التي يجب تشغيلها. \n
- البساطة — لا حاجة لتهيئة الخادم. \n
- بداية سريعة — النشر بأمر واحد. \n
لكن هناك بعض الفروق الدقيقة: "البدء البارد" (cold start) قد يستغرق بضع ثوانٍ، خاصة للغات JVM. ومع ذلك، تعلم المزودون الحديثون كيفية التعامل مع هذا: AWS Lambda مع Provisioned Concurrency أو Google Cloud Functions مع min-instances تحل المشكلة.
\n\nAWS Lambda: ملك الحوسبة بدون خادم
\nلنبدأ بالخدمة الأكثر شهرة — AWS Lambda. تقدم Amazon Web Services نظامًا بيئيًا ناضجًا حيث يعمل Kotlin "مباشرة من الصندوق" عبر Java Runtime.
\nكيفية تهيئة AWS Lambda لـ Kotlin
\nستحتاج إلى Gradle أو Maven. سنستخدم Gradle مع إضافة Kotlin. مثال build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.0"\n id("com.github.johnrengelman.shadow") version "7.1.2"\n}\n\ndependencies {\n implementation("com.amazonaws:aws-lambda-java-core:1.2.2")\n implementation("com.amazonaws:aws-lambda-java-events:3.11.0")\n}\n\ntasks {\n shadowJar {\n archiveBaseName.set("lambda-function")\n archiveClassifier.set("")\n }\n}\nالآن لنكتب الدالة نفسها. تتوقع AWS Lambda فئة بطريقة handleRequest. إليك معالج بسيط يعيد تحية:
import com.amazonaws.services.lambda.runtime.Context\nimport com.amazonaws.services.lambda.runtime.RequestHandler\n\nclass HelloHandler : RequestHandler<Map<String, String>, String> {\n override fun handleRequest(input: Map<String, String>, context: Context): String {\n val name = input["name"] ?: "World"\n return "Hello, $name! دالة serverless الخاصة بك بلغة Kotlin تعمل!"\n }\n}\nقم ببناء fat JAR: ./gradlew shadowJar. قم بتحميله إلى AWS Lambda، وحدد runtime Java 11 أو Java 17. تم!
العمل مع أحداث AWS
\nغالبًا ما تتفاعل Lambda مع أحداث S3 أو DynamoDB أو API Gateway. مثال معالج لـ S3:
\nimport com.amazonaws.services.lambda.runtime.events.S3Event\n\nclass S3Handler : RequestHandler<S3Event, String> {\n override fun handleRequest(event: S3Event, context: Context): String {\n val bucket = event.records.f