تنفيذ وظائف Serverless Node.js باستخدام Google Cloud

نشرت: 2022-03-11

إنشاء البرنامج لا ينتهي بكتابة كود جيد. يكتمل عندما يتم نشر البرنامج ويكون قادرًا على التعامل مع الطلبات بشكل صحيح ومتى يمكننا التوسع دون إعاقة الأداء وتكلفة تشغيله.

ربما تفكر في كيفية قيامك بالحوسبة السحابية للعناية بكل هذه الأشياء. "إذن ما هو هذا الشيء الجديد بدون خادم ، Vignes؟"

وظائف Node.js بدون خادم باستخدام Google Cloud

الحوسبة بدون خادم هي أسلوب معماري يتم فيه تنفيذ الكود في نظام أساسي سحابي حيث لا داعي للقلق بشأن إعداد الأجهزة والبرامج والأمان والأداء وتكاليف وقت خمول وحدة المعالجة المركزية. إنه تقدم في الحوسبة السحابية يتجاوز البنية التحتية التي تلخص بيئة البرامج أيضًا. هذا يعني أنه لا يلزم التكوين لتشغيل الكود.

مع عدم وجود خادم ، سيكون ما يلي هو أسلوب عملك:

  1. تطوير الكود.

  2. قم بتحميل الكود إلى مزود الخدمة.

  3. تكوين المشغل (طلب HTTP ، في حالتنا).

تم عملنا! الآن سيهتم مزود النظام الأساسي بالطلبات الواردة والتوسع.

مقدمة في الخدمات المصغرة بدون خادم

غالبًا ما تقترن الهندسة المعمارية بدون خادم بتصميم أسلوب الخدمات المصغرة. الخدمة المصغرة هي جزء مستقل من البرامج الكبيرة التي تتعامل مع الطلبات لوحدة واحدة محددة. من خلال إنشاء خدمات صغيرة يمكن تشغيلها في بيئة بدون خادم ، يصبح من السهل الحفاظ على الكود وتسريع عمليات النشر.

مقدمة عن AWS Lambda & GCF ، مقارنة

غالبًا ما يطلق على الميزة التي لا تحتوي على خادم اسم "النهاية الخلفية كخدمة" أو "تعمل كخدمة". بدأ عدد مزودي خدمات الحوسبة بدون خادم في الازدياد. ومع ذلك ، فإن بعض اللاعبين الكبار التقليديين يوفرون أيضًا خيارات بدون خوادم ، مثل وظائف AWS Lambda من Amazon Web Services ووظائف Google Cloud (GCF) في Google Cloud ، وهذا الأخير ، أثناء فترة تجريبية حاليًا ، هو ما أستخدمه. على الرغم من أنها تعمل بشكل مشابه ، إلا أن هناك بعض الاختلافات المهمة بينهما.

AWS Lambda وظائف جوجل كلاود
دعم اللغة Node.js ، Python ، C # ، Java Node.js
محفزات DynamoDB و Kinesis و S3 و SNS و API gateway (HTTP) و CloudFront والمزيد HTTP ، Cloud PubSub ، حاوية التخزين السحابية
أقصى وقت للتنفيذ 300 ثانية 540 ثانية

في هذه المقالة ، سنستعرض عملية تنفيذ نشر التعليمات البرمجية بدون خادم باستخدام GCF. وظائف Google Cloud هي حل حسابي غير متزامن خفيف الوزن يعتمد على الأحداث يسمح لك بإنشاء وظائف صغيرة أحادية الغرض تستجيب لأحداث السحابة دون الحاجة إلى إدارة خادم أو بيئة وقت تشغيل.

لدى GCF ثلاثة تطبيقات ممكنة منفصلة بناءً على المشغلات.

  1. يؤدي HTTP إلى توجيه طلبات HTTP إلى وظائف السحابة

  2. تنشر مسارات المشغل / الناشر الداخلي في Google وطلبات الاشتراك في وظائف السحابة

  3. تقوم حاوية التخزين السحابي بتشغيل مسارات أي تغييرات تم إجراؤها على حاوية التخزين على وظيفة السحابة

لنقم بإنشاء إعداد يستند إلى مشغل HTTP باستخدام وظائف Google Cloud

لا تتطلب وظائف Google Cloud أي إعداد أو تثبيت خاص إضافي. يضمن GCF أن بيئة العقدة الافتراضية قد تم إعدادها وجاهزة للتنفيذ. عندما يتم إنشاء وظيفة سحابية باستخدام HTTP كمشغل ، فإنها توفر عنوان URL لتشغيل الوظيفة. بالمقارنة مع AWS Lambda ، التي تستخدم بوابة API كوسيلة للتواصل معها ، توفر وظائف Google Cloud عنوان URL على الفور بناءً على projectID والمنطقة.

رسم تخطيطي لـ Google Cloud Platform - وظائف السحابة و AWS Lambda

إنشاء تطبيق Node.js بدون خادم

لجعل الكود الخاص بنا قابلاً للتنفيذ في GCF ، يجب أن نلف الكود داخل وظيفة واحدة. سوف يستدعي GCF هذه الوظيفة المحددة كلما حدث الزناد. الطرق الممكنة للقيام بذلك هي التحميل ،

  1. ملف واحد: قم بتصدير وظيفة افتراضية تستدعي وظائف أخرى بناءً على الطلب.

  2. ملفات متعددة: لديك ملف index.js يتطلب جميع الملفات الأخرى وتصدير الوظيفة الافتراضية كنقطة بداية.

  3. ملفات متعددة: قم بتكوين ملف رئيسي واحد في package.json باستخدام "main": "main.js" كنقطة بداية.

ستعمل أي من الطرق المذكورة أعلاه.

لدى GCF إصدار معين لوقت تشغيل Node مدعوم. تأكد من كتابة الكود لدعم هذا الإصدار المعين. في وقت إنشاء هذا المنشور ، كان GCF يدعم إصدار Node v6.11.1.

لإنشاء وظيفة ، هناك بعض الخيارات التي يجب مراعاتها.

  1. الذاكرة يخبر هذا مقدار الذاكرة المطلوبة لمعالجة الطلب لوقت تشغيل واحد. معرف بالميغا بايت. بالنسبة إلى التطبيقات الصغيرة ، يجب أن يكون حجم 128 ميجا بايت كافيًا تمامًا ، ولكن يمكن زيادته حتى 2 جيجا بايت.

  2. Timeout Timeout ، كما يوحي الاسم ، يحدد مهلة تنفيذ التعليمات البرمجية المتوقعة. بعد ذلك ، سيتم قتل الرمز وإيقافه. أي إعدام بعد هذه النقطة سيتوقف فجأة. أقصى مهلة 540 ثانية.

  3. وظيفة للتنفيذ بالرغم من أنه يمكن تصدير أكثر من وظيفة واحدة من ملف المعالج الرئيسي ، إلا أننا نحتاج إلى تكوين وظيفة واحدة يجب تشغيلها لمعالجة الطلب. يسمح هذا للمطور بالحصول على نقاط دخول متعددة بناءً على طريقة HTTP / عنوان URL.

لتحميل الكود ، ما عليك سوى لصق نسخة من الكود لإنشاء بوابة إلكترونية. لأكثر من ملف واحد ، اضغط المحتويات وقم بتحميل الملف. تأكد ، في حالة وجود ملف ZIP ، يجب أن يكون هناك ملف index.js أو ملف package.json مع الملف الرئيسي المذكور.

يجب ذكر أي تبعية لوحدة NPM في package.json . يحاول GCF تثبيت الوحدات المذكورة في ملف package.json أثناء إعداد المرة الأولى.

لنقم بإنشاء معالج بسيط لإرجاع 200 حالة وبعض الرسائل. قم بإنشاء دالة وأضف الكود التالي إلى المصدر.

 exports.httpServer = function httpServer(req, res) { console.log(req); res.status(200).send('Server is working'); } 

لقطة شاشة للوظيفة التي يتم إنشاؤها

بمجرد إنشاء الوظيفة ، افتح عنوان URL المقدم لتشغيل الوظيفة. يجب أن تستجيب كما يلي.

لقطة شاشة لمخرج المتصفح "الخادم يعمل"

الآن ، دعنا نفحص الكائن req في السجلات. لعرض السجلات ، يوفر GCF خيارات مباشرة من وحدة التحكم. انقر على النقاط العمودية وافتح خيار السجلات.

لقطة شاشة لفتح خيار السجلات

الآن ، دعنا نحدِّث الكود للتعامل مع المسارات البسيطة /users .

يتم استخدام الكود التالي للتعامل مع طلب GET & POST بسيط لمسار /users :

 exports.httpServer = function httpServer(req, res) { const path = req.path; switch(path) { case '/users': handleUsers(req, res); break; default: res.status(200).send('Server is working'); } }; const handleUsers = (req, res) => { if (req.method === 'GET') { res.status(200).send('Listing users...'); } else if (req.method === 'POST') { res.status(201).send('Creating User...') } else { res.status(404); } }

بعد التحديث ، دعنا نختبرها في المتصفح الآن ، ولكن هذه المرة مع /users في النهاية.

لقطة شاشة لمخرج المتصفح "سرد المستخدمين ..."

هذا بارد. أنشأنا خادم HTTP أساسيًا مع التوجيه.

العمليات والتصحيح

إذا كانت الشفرة هي المكان الذي انتهت فيه القصة ، فلن تبحث عن خيارات البنية التحتية مثل تطبيقات Node.js بدون خادم. فيما يلي ملخص موجز لكيفية الاهتمام بالمهام الشائعة مثل النشر وتصحيح الأخطاء. الأشياء التي يقوم بها مطورو Node.js بالفعل للتطبيقات الأخرى.

تعيين:

يمكن نشر رمز الوظائف بأربع طرق.

  • نسخ لصق الرمز في وحدة التحكم

  • تحميل ملف مضغوط

  • النشر من حاوية التخزين السحابي كملف ZIP

  • النشر من مستودع مصدر السحابة

من الواضح أن الخيار الأكثر ملاءمة هو النشر من مستودع المصدر.

استدعاء:

أثناء إنشاء الوظيفة ، توفر وحدة التحكم عنوان HTTP URL لتشغيل الوظيفة الموجودة بالتنسيق: https://<region>-<project-id>.cloudfunctions.net/<function-name>

تتضمن وظيفة AWS Lambda مشكلات بدء التشغيل البارد التي تجعل تنفيذ الوظيفة يستغرق وقتًا إضافيًا لبدء التشغيل. بمجرد البدء ، ستستجيب عمليات الإعدام التالية بشكل طبيعي. يشار إلى وقت البدء الإضافي الأولي هذا بالبداية الباردة. على الرغم من أننا لا نملك الوثائق الرسمية لـ GCF المتعلقة بهذا الموضوع ، إلا أن مشكلات البداية الباردة لم تظهر أثناء الاختبار.

تصحيح:

يتكامل GCF مع خدمة Stackdriver Logging في Google Cloud. سيتم تسجيل جميع سجلات وأخطاء وحدة التحكم هنا ، وهي تساعد في تصحيح الأخطاء البرمجية التي تم نشرها بالفعل.

اختبارات:

توفر وحدة التحكم خيارات لاختبار الوظيفة عن طريق تمرير JSON كمدخل. سيتم استدعاء الوظيفة باستخدام JSON كإدخال وسيتم عرض الإخراج في وحدة التحكم. يشبه الطلب (الإدخال) والاستجابة إطار عمل Express.js ويمكن اختبار الوحدة أثناء عملية التطوير نفسها. إذا كنت بحاجة إلى تجديد معلومات حول اختبار Node.js ، فراجع دليل Node.js لإجراء اختبارات التكامل بالفعل

القيود والخطوات التالية

استخدام الوظائف بدون خادم له مزاياه الخاصة ، كما أنه يأتي مع قيود

  • تأمين البائع: يقيد الكود الذي نكتبه لمزود خدمة معين. يتطلب نقل الكود إلى مزود آخر إعادة كتابة الكود بجهود كبيرة نحو الترحيل. نظرًا لأن هذا يمكن أن يكون مشكلة كبيرة ، يجب أن نكون حذرين للغاية عند اختيار مزود الخدمة.

  • القيود المفروضة على عدد الطلبات وموارد الأجهزة: غالبًا ما يحد الموفرون من عدد الطلبات المتوازية التي ستتعامل معها إحدى الوظائف في كل مرة. هناك قيود على الذاكرة كذلك. يمكن رفع هذه الأنواع من القيود من خلال التحدث إلى المزود ، لكنها ستظل موجودة.

تنضج وظائف Google Cloud وتتحسن كثيرًا. لا يزال يتم تحسينه وتحديثه بشكل متكرر ، خاصة في اللغات التي يمكنه دعمها. إذا كنت تخطط لاستخدام وظائف Google Cloud ، فراقب التغييرات لتجنب أي تغييرات مفاجئة في التنفيذ.


مزيد من القراءة على مدونة Toptal Engineering:

  • العمل مع دعم TypeScript و Jest: برنامج تعليمي لـ AWS SAM