Serverless بلغة Java: لماذا هو ليس مخيفًا بل ومربحًا؟
\n\nعندما تسمع "serverless"، أول ما يتبادر إلى الذهن هو Node.js أو Python. تبدو Java وكأنها وزن ثقيل "يستغرق وقتًا طويلاً في البدء" و"يستهلك الكثير من الذاكرة". لكن دعونا نواجه الحقيقة: لا تزال Java هي المعيار المؤسسي، وserverless الحديث ليس مجرد "شغّل دالة وانسي الأمر". إنها بنية يمكنها توفير الكثير من المال والأعصاب إذا تعاملت معها بذكاء.
\n\nفي هذه المقالة، سنشرح كيفية كتابة دوال serverless بلغة Java، باستخدام AWS Lambda كمثال، بالإضافة إلى النظر في البدائل: Google Cloud Functions وAzure Functions ومنصة Vercel. ستتعرف على المزالق التي تنتظر مطور Java في عالم اللاخوادم وكيفية تجنبها. هيا بنا!
\n\nما هو serverless ولماذا Java؟
\n\nServerless (أو FaaS — Function as a Service) هو نموذج حوسبة سحابية حيث تكتب الكود، وتحمله إلى السحابة، ويقرر المزود بنفسه متى وكيف يشغله. أنت تدفع فقط مقابل وقت التنفيذ الفعلي وعدد الطلبات. لا خوادم، ولا إدارة للبنية التحتية.
\n\nلماذا Java؟ هناك عدة أسباب:
\n- \n
- الاستقرار والنضج. Java مع كتابتها الصارمة ومكتباتها المختبرة مثالية للمهام المؤسسية. \n
- الأداء. أجهزة JVM الحديثة (خاصة GraalVM) تسمح بتقليل وقت البدء البارد إلى أجزاء من الثانية. \n
- النظام البيئي. Spring Boot وMicronaut وQuarkus — جميعها مُكيَّفة لـ serverless. \n
لكن هناك فارق بسيط: "البدء البارد" (cold start) في Java قد يكون أطول منه في Python أو Go. ومع ذلك، باستخدام الأدوات الصحيحة، يمكن حل هذه المشكلة.
\n\nAWS Lambda: اللاعب الرئيسي في سوق serverless بلغة Java
\n\nAWS Lambda هي على الأرجح الخدمة الأكثر شيوعًا لدوال serverless. وهي تدعم Java "مباشرة" وتقدم مسارين: Java 8/11/17 الكلاسيكي وSnapStart (تقنية تجعل البدء البارد غير محسوس تقريبًا).
\n\nكتابة أول دالة Lambda بلغة Java
\n\nلنقم بإنشاء دالة بسيطة تعالج طلبات HTTP عبر Amazon API Gateway. للقيام بذلك، سنحتاج إلى مشروع Maven وبعض التبعيات.
\n\nالخطوة 1. قم بإنشاء مشروع Maven مع ملف pom.xml التالي:
<?xml version="1.0" encoding="UTF-8"?>\n<project xmlns="http://maven.apache.org/POM/4.0.0"\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:schemaLocation="http://maven.apache.org/POM/4.0.0\n http://maven.apache.org/xsd/maven-4.0.0.xsd">\n <modelVersion>4.0.0</modelVersion>\n\n <groupId>com.pythonlib</groupId>\n <artifactId>serverless-java</artifactId>\n <version>1.0-SNAPSHOT</version>\n\n <dependencies>\n <dependency>\n <groupId>com.amazonaws</groupId>\n <artifactId>aws-lambda-java-core</artifactId>\n <version>1.2.2</version>\n </dependency>\n <dependency>\n <groupId>com.amazonaws</groupId>\n <artifactId>aws-lambda-java-events</artifactId>\n <version>3.11.3</version>\n </dependency>\n </dependencies>\n\n <build>\n <plugins>\n <plugin>\n <groupId>org.apache.maven.plugins</groupId>\n <artifactId>maven-shade-plugin</artifactId>\n <version>3.2.4</version>\n <executions>\n <execution>\n <phase>package</phase>\n <goals><goal>shade</goal></goals>\n </execution>\n </execution