يا جماعة الخير، السلام عليكم ورحمة الله.
اسمحولي اليوم أحكيلكم قصة صارت معي ومع فريقي قبل كم سنة، قصة فيها شوية وجع راس، وشوية مصاري انحرقت على الفاضي، بس نهايتها كانت درس مهم غيّر طريقة تفكيرنا في بناء التطبيقات بالكامل. قبل فترة، كنا شغالين على مشروع ناشئ، تطبيق ويب بسيط فيه شوية خدمات ذكية. بحكم خبرتي، قررنا نستضيفه على السحابة، واخترنا خادم افتراضي (Virtual Server) من أحد المزودين المشهورين.
في البداية، الأمور كانت “عال العال”. التطبيق شغال، والمستخدمين مبسوطين. لكن مع نهاية الشهر الأول، وصلت الفاتورة. فتحتها وأنا كلي ثقة، وتفاجأت بالرقم! كان أعلى بكثير من توقعاتنا. قلت لحالي “يلا بسيطة، يمكن الشهر الأول فيه تكاليف إعداد”. لكن الفاتورة الثانية كانت نفس القصة، والثالثة أكدت الكارثة.
لما تعمقنا في تحليل الأرقام ولوحات المراقبة (Dashboards)، اكتشفنا الحقيقة المرة: معالج الخادم (CPU) كان معظم الوقت “نايم”! نسبة استخدامه نادراً ما كانت تتجاوز 5% أو 10%. كانت هناك قفزات بسيطة في الاستخدام لما يدخل كم مستخدم مع بعض، بس 90% من الوقت، كنا ندفع ثمن كهرباء وحديد وقوة معالجة لا نستخدمها. كانت خوادمنا، بكل ما تعنيه الكلمة، عبارة عن مدفأة فاخرة تحرق أموالنا وهي خاملة. شعور بالقهر ما بعده شعور، وكأنك بتدفع إيجار محل تجاري ضخم عشان تبيع فيه علبة لبان في اليوم.
هنا بدأت رحلة البحث عن حل، وهناك سمعت لأول مرة عن مصطلح غريب: “Serverless” أو “الحوسبة بدون خوادم”. كيف يعني بدون خوادم؟ وين الكود بده يشتغل؟ في الهوا؟ وقتها بدأت المغامرة الحقيقية اللي بدي أشارككم تفاصيلها اليوم.
شو قصة “الحوسبة بدون خوادم” (Serverless)؟
أول إشي لازم أوضحه، الاسم فيه شوية “خداع تسويقي”. الحوسبة بدون خوادم لا تعني عدم وجود خوادم على الإطلاق. أكيد في خوادم، وفيها معالجات وذاكرة وكل إشي، لكن الفرق الجوهري هو: أنت كمطور لم تعد مسؤولاً عن هذه الخوادم.
خليني أبسطها بمثال من حياتنا اليومية. تخيل أنك تريد أن تأكل البيتزا:
- الطريقة التقليدية (الخوادم التقليدية): أنت تبني مطبخاً كاملاً في بيتك. تشتري فرناً، وثلاجة، وأدوات عجن، وتتعلم كيف تشغل الفرن وتضبط حرارته، وتتأكد من نظافته وصيانته الدورية. كلما أردت بيتزا، تشغل الفرن وتخبزها. المشكلة؟ الفرن والمطبخ موجودان ويستهلكان مساحة وكهرباء حتى لو لم تكن تخبز البيتزا.
- طريقة الـ Serverless: أنت لا تملك مطبخاً. عندما تشعر بالجوع، ترفع سماعة الهاتف وتطلب بيتزا من مطعم قريب. تصلك البيتزا ساخنة، تأكلها، وتدفع ثمنها فقط. المطعم هو الذي يهتم بالفرن والصيانة والعمال. أنت فقط تستمتع بالنتيجة النهائية عند الحاجة.
هذا بالضبط هو مبدأ Serverless. أنت تكتب “وظيفة” (Function) برمجية صغيرة تؤدي مهمة محددة، وترفعها لمزود الخدمة السحابية (مثل AWS Lambda, Azure Functions, Google Cloud Functions). ومزود الخدمة هو المسؤول عن تشغيل هذه الوظيفة عند استدعائها، وتوفير الموارد اللازمة لها، ثم إيقاف كل شيء بعد انتهاء التنفيذ. أنت تدفع فقط مقابل أجزاء من الثانية التي عملت فيها وظيفتك. لا يوجد أي تكلفة عندما تكون الوظيفة “خاملة”.
النقلة النوعية: من التفكير بالخوادم إلى التفكير بالوظائف
كان أكبر تحدٍ واجهناه هو تغيير عقليتنا. كنا متعودين نفكر بـ “الخادم”: كم حجمه؟ كم CPU؟ كم RAM؟ هل نحتاج Load Balancer؟ كيف نعمل Auto-scaling؟
مع Serverless، أصبح التفكير مختلفاً تماماً. صرنا نفكر بـ “الأحداث” و “الوظائف”:
Event (حدث) ⬅️ triggers ⬅️ Function (وظيفة)
الحدث ممكن يكون أي شيء:
- طلب HTTP جديد يصل لواجهة برمجة التطبيقات (API).
- صورة جديدة تم رفعها إلى خدمة تخزين (مثل Amazon S3).
- رسالة جديدة وصلت إلى طابور رسائل (like SQS).
- مهمة مجدولة (Cron Job) تريد تشغيلها كل ساعة.
لكل حدث، نكتب وظيفة صغيرة ومستقلة تتعامل معه. هذا النموذج غيّر طريقة تصميمنا للتطبيقات، وجعلها أكثر مرونة وقابلية للتفكيك (Decoupled).
لماذا كانت Serverless طوق النجاة لمشروعنا؟
بعد أن فهمنا المبدأ، قررنا أن نبدأ بخطوة صغيرة. أخذنا إحدى الخدمات الصغيرة في تطبيقنا – خدمة مسؤولة عن ضغط الصور التي يرفعها المستخدمون – وقمنا بإعادة كتابتها كـ “وظيفة لامدا” (Lambda Function) على AWS.
النتيجة كانت مذهلة. التكلفة الشهرية لتشغيل هذه الخدمة تحديداً انخفضت بنسبة تزيد عن 95%. انتقلنا من دفع مبلغ ثابت لخادم يعمل طوال الوقت، إلى دفع سنتات قليلة مقابل الثواني الفعلية التي استغرقتها عملية ضغط الصور. هنا أدركنا أننا وجدنا الكنز، وبدأنا بترحيل المزيد من خدماتنا تدريجياً.
الميزات التي أنقذتنا لم تكن مادية فقط:
- التوفير الهائل في التكاليف (FinOps): هذه هي الميزة الأوضح. أنت تدفع مقابل الاستخدام الفعلي بالمللي ثانية. لا يوجد مال محروق على خوادم خاملة. هذا مثالي للتطبيقات الناشئة، المشاريع الجانبية، أو أي تطبيق ذي استخدام متقطع وغير متوقع.
- التوسع التلقائي (Automatic Scaling): في السابق، كنا نقلق من “حضن الموت” (Hug of Death) – عندما ينتشر تطبيقك فجأة ويتهاوى الخادم تحت ضغط الزوار. مع Serverless، هذه المشكلة تختفي. إذا وصلك طلب واحد، ستعمل نسخة واحدة من وظيفتك. إذا وصلك 1000 طلب في نفس الثانية، سيقوم مزود الخدمة تلقائياً بتشغيل 1000 نسخة متزامنة من وظيفتك. تتوسع وتتقلص من صفر إلى الآلاف ثم تعود إلى الصفر بسلاسة تامة.
- تقليل العبء التشغيلي (وجع راس أقل): يا جماعة، لم نعد نقلق بشأن تحديث نظام التشغيل، أو تطبيق الرقع الأمنية (Security Patches)، أو إدارة الخوادم. هذا حررنا كمطورين للتركيز على ما يهم حقاً: كتابة كود نظيف يقدم قيمة للمستخدم. صرنا نركز على “البيزنس لوجيك” بدل ما نضيع وقتنا في إدارة البنية التحتية.
مثال عملي: بناء API بسيط باستخدام AWS Lambda و API Gateway
حتى لا يكون الكلام نظرياً فقط، دعونا نرى كيف يمكن بناء واجهة برمجة تطبيقات (API) بسيطة باستخدام Serverless. سنستخدم Node.js كمثال.
المطلوب: بناء نقطة نهاية (endpoint) تستقبل اسم شخص كـ query parameter وترجع رسالة ترحيب.
هذا هو كل الكود الذي تحتاجه لوظيفة Lambda:
// index.js
exports.handler = async (event) => {
// 'event' object contains all the request data
console.log("Received event:", JSON.stringify(event, null, 2));
// Get the name from the query string parameters, default to 'يا طيب'
const name = event.queryStringParameters && event.queryStringParameters.name
? event.queryStringParameters.name
: 'يا طيب';
const response = {
statusCode: 200,
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
message: `أهلاً وسهلاً فيك يا ${name}!`
}),
};
return response;
};
شرح بسيط للكود:
exports.handler: هذه هي الدالة الرئيسية التي ستستدعيها AWS Lambda عند وقوع الحدث.event: هذا الكائن يحتوي على كل معلومات الطلب القادم من API Gateway (مثل الـ path, headers, query parameters, body).queryStringParameters.name: هنا نستخرج قيمة المتغيرnameمن الرابط (e.g.,/hello?name=عمر).response: يجب أن نعيد كائناً بهذا الشكل المحدد حتى يفهمه API Gateway ويرسله كرد HTTP صحيح للمستخدم.
بعد كتابة هذا الكود، نقوم بضغطه في ملف zip ورفعه إلى AWS Lambda. ثم نقوم بربطه مع خدمة API Gateway لإنشاء رابط URL عام. هذا كل شيء! الآن لديك API يعمل، يتوسع تلقائياً، وتكلفته شبه صفر إذا لم يستخدمه أحد.
نصائح عملية من خبرة أبو عمر
بعد سنوات من العمل مع Serverless، تعلمت بعض الدروس التي أحب أن أشاركها معكم:
- ابدأ صغيراً: لا تحاول ترحيل تطبيقك الضخم كله مرة واحدة. اختر خدمة صغيرة، غير حرجة، وجرب عليها. تعلم، ارتكب الأخطاء، ثم توسع.
- احذر من “البداية الباردة” (Cold Start): عندما لا يتم استدعاء وظيفتك لفترة، يقوم مزود الخدمة بإيقافها تماماً. أول طلب يصل بعد فترة الخمول هذه سيستغرق وقتاً أطول قليلاً (من بضع مئات من الملي ثانية إلى ثوانٍ) لأن المزود يحتاج إلى تهيئة بيئة التشغيل من جديد. هذا يسمى “Cold Start”. يمكن التخفيف من أثره باستخدام تقنيات مثل “Provisioned Concurrency” إذا كانت السرعة حرجة جداً لتطبيقك.
- استخدم إطار عمل (Framework): إدارة عشرات أو مئات الوظائف يدوياً عبر واجهة AWS أمر مرهق. استخدم أدوات مثل Serverless Framework أو AWS SAM. هذه الأدوات تسمح لك بتعريف كل بنيتك التحتية (الوظائف، الـ APIs، قواعد البيانات) في ملف واحد (
serverless.yml) وتسهل عملية النشر والتحديث بشكل كبير. - راقب تكاليفك: صحيح أن Serverless موفرة، لكن خطأ برمجي بسيط (مثل حلقة لا نهائية تستدعي وظيفة أخرى) يمكن أن يؤدي إلى فاتورة ضخمة. استخدم أدوات مراقبة التكاليف مثل AWS Cost Explorer وقم بوضع تنبيهات (Billing Alarms) لتجنب المفاجآت. هذا هو جوهر ممارسة الـ FinOps.
متى لا تكون Serverless هي الخيار الأنسب؟
رغم كل حبي لهذه التقنية، هي ليست حلاً سحرياً لكل المشاكل. هناك حالات قد لا تكون فيها الخيار الأفضل:
- العمليات طويلة الأمد: معظم منصات Serverless تضع حداً أقصى لوقت تنفيذ الوظيفة (مثلاً، 15 دقيقة في AWS Lambda). إذا كان لديك عملية تحتاج ساعات لتكتمل، فالخادم التقليدي أو الحاويات (Containers) قد تكون خياراً أفضل.
- تطبيقات ذات حمل ثابت وعالٍ جداً: إذا كان تطبيقك يتلقى ملايين الطلبات بشكل ثابت ومستمر 24/7، قد يكون حجز خادم مخصص (Reserved Instance) أرخص على المدى الطويل. لكن هذه حالة نادرة لمعظم التطبيقات.
- تطبيقات تتطلب تحكماً كاملاً في بيئة التشغيل: إذا كنت تحتاج إلى تعديل نواة نظام التشغيل (Kernel) أو تثبيت برامج خاصة جداً، فإن Serverless تقيدك بالبيئات التي يوفرها المزود.
الخلاصة: غيّر عقليتك ووفر أموالك 💡
رحلتنا من خوادم تحرق المال إلى بنية تحتية مرنة وفعالة التكلفة كانت بمثابة صحوة. الحوسبة بدون خوادم (Serverless) لم توفر علينا المال فحسب، بل حررتنا من عبء الإدارة والتشغيل، وسمحت لنا بالتركيز على الابتكار وتقديم قيمة حقيقية.
نصيحتي الأخيرة لك: لا تخف من تجربة الجديد. إذا كان لديك مشروع جانبي، أو تطبيق صغير، أو حتى خدمة داخل تطبيقك الكبير تعاني من الاستخدام المتقطع، جرب أن تحولها إلى Serverless. ابدأ اليوم، شاهد الفرق في فاتورتك القادمة، وادعيلي. ✅
يلا يا جماعة، جربوها ومش رح تندموا! بالتوفيق للجميع.