مقدمة عن الحوسبة بدون خادم باستخدام Kotlin
أصبحت البنية التحتية بدون خادم (Serverless) معيارًا لبناء تطبيقات قابلة للتوسع وفعالة من حيث التكلفة. تعتبر AWS Lambda واحدة من أشهر الخدمات التي تتيح لك تشغيل الكود دون إدارة الخوادم. على الرغم من أن Lambda غالبًا ما ترتبط بـ Node.js أو Python، إلا أن لغة Kotlin، بفضل إيجازها وأمان أنواعها وتوافقها الكامل مع نظام Java البيئي، أصبحت خيارًا ممتازًا لكتابة دوال بدون خادم.
في هذه المقالة، سنتناول بالتفصيل كيفية إنشاء واختبار ونشر دوال بدون خادم باستخدام Kotlin لـ AWS Lambda. ستتعلم كيفية إعداد مشروع، ومعالجة الأحداث من API Gateway و S3 و DynamoDB، بالإضافة إلى تحسين الأداء.
إعداد مشروع Kotlin لـ AWS Lambda
للبدء، نحتاج إلى مشروع Gradle بالاعتماديات الصحيحة. الميزة الرئيسية لـ Kotlin هي القدرة على استخدام جميع مكتبات Java، بما في ذلك AWS SDK الرسمي.
إنشاء مشروع Gradle
قم بإنشاء ملف build.gradle.kts بالإعدادات التالية:
plugins { kotlin("jvm") version "1.9.22" id("io.github.deweyjose.lambda-packager") version "0.1.2"}
dependencies { implementation("com.amazonaws:aws-lambda-java-core:1.2.3") implementation("com.amazonaws:aws-lambda-java-events:3.11.4") implementation("com.google.code.gson:gson:2.10.1")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") testImplementation("org.mockito:mockito-core:5.11.0")}
tasks.withType<Jar> { duplicatesStrategy = DuplicatesStrategy.EXCLUDE from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })}هيكل دالة المعالجة (Handler)
يجب أن تقوم أي دالة Lambda في Kotlin بتنفيذ واجهة RequestHandler أو RequestStreamHandler. دعنا نلقي نظرة على مثال بسيط لـ HelloHandler:
import com.amazonaws.services.lambda.runtime.Contextimport com.amazonaws.services.lambda.runtime.RequestHandler
class HelloHandler : RequestHandler<Map<String, String>, String> { override fun handleRequest(input: Map<String, String>, context: Context): String { val name = input["name"] ?: "World" return "Hello, $name! Greetings from Kotlin Lambda!" }}ملاحظة: تسمح Kotlin باستخدام Map<String, String> للعمل مع أحداث JSON، ولكن بالنسبة للهياكل المعقدة، من الأفضل إنشاء Data Class.
العمل مع مشغلات AWS المختلفة
نادرًا ما تعمل الدوال بدون خادم بشكل منفرد. دعنا نلقي نظرة على ثلاثة سيناريوهات شائعة: API Gateway و S3 و DynamoDB.
API Gateway + Lambda على Kotlin
لمعالجة طلبات HTTP، استخدم الفئة APIGatewayProxyRequestEvent:
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEventimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent
class ApiHandler : RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { override fun handleRequest(event: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent { val body = """ {"message": "Received ${event.httpMethod} request to ${event.path}", "queryParams": "${event.queryStringParameters}"} """.trimIndent()
return APIGatewayProxyResponseEvent() .withStatusCode(200) .withHeaders(mapOf("Content-Type" to "application/json")) .withBody(body) }}معالجة أحداث S3
عند رفع كائن جديد إلى حاوية S3، يمكن لـ Lambda التشغيل تلقائيًا:
import com.amazonaws.services.lambda.runtime.events.S3Eventimport com.amazonaws.services.s3.AmazonS3ClientBuilder
class S3ProcessorHandler : RequestHandler<S3Event, String>