إدارة الوظائف


يمكنك نشر الدوال وحذفها وتعديلها باستخدام Firebase أوامر سطر الأوامر أو من خلال ضبط خيارات وقت التشغيل في رمز مصدر الدوال.

دوال النشر

لنشر الدوالّ، نفِّذ الأمر التالي لواجهة سطر أوامر Firebase:

firebase deploy --only functions

ينشر واجهة سطر الأوامر Firebase تلقائيًا جميع الدوال المصدر في نفس الوقت. إذا كان مشروعك يحتوي على أكثر من 5 دوال، ننصحك باستخدام العلامة --only مع أسماء دوال معيّنة لنشر الدوال التي حرّرتها فقط. يؤدي نشر وظائف معيّنة بهذه الطريقة إلى تسريع عملية النشر ومساعدتك في تجنُّب مواجهة حصص النشر. على سبيل المثال:

firebase deploy --only functions:addMessage,functions:makeUppercase

عند نشر أعداد كبيرة من الدوالّ، قد تتجاوز الحصة العادية وتتلقّى رسائل خطأ HTTP 429 أو 500. لحل المشكلة فإن ذلك، يؤدي إلى نشر الدوال في مجموعات مكونة من 10 أشخاص أو أقل.

يمكنك الاطّلاع على مرجع واجهة سطر الأوامر Firebase للحصول على قائمة كاملة بالسمات المتاحة الأوامر.

بشكل تلقائي، يظهر واجهة سطر الأوامر Firebase في مجلد functions/ عن رمز المصدر. يمكنك تنظيم الدوال إذا كنت تفضّل ذلك. في قواعد رموز برمجية أو مجموعات متعددة من الملفات.

حذف الدوالّ

يمكنك حذف الدوال المنشورة سابقًا بالطرق التالية:

  • بشكل صريح في واجهة سطر الأوامر Firebase باستخدام functions:delete
  • بشكل صريح في وحدة تحكّم Google Cloud.
  • بشكل ضمني عن طريق إزالة الدالة من المصدر قبل نشرها

جميع عمليات الحذف التأكيد قبل إزالة الدالة من الإنتاج.

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

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

من خلال حذف الدالة الضمنية، يحلّل firebase deploy المصدر إزالة أي وظائف تمت إزالتها من الملف من الإنتاج.

تعديل اسم الدالة أو منطقتها أو عامل تشغيلها

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

إعادة تسمية دالة

لإعادة تسمية دالة، أنشئ نسخة جديدة من الدالة في المصدر باسم جديد، ثم نفِّذ أمرَي نشر منفصلَين. ينشر الأمر الأول دالة مُسمّاة حديثًا، وسيزيل الأمر الثاني البيانات المنشورة سابقًا . على سبيل المثال، إذا كانت لديك دالة Node.js يُسمى webhook وتريد إلى webhookNew، راجع الرمز على النحو التالي:

// before
const functions = require('firebase-functions/v1');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions/v1');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

بعد ذلك، شغّل الأوامر التالية لنشر الدالة الجديدة:

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

تغيير منطقة الدالة أو مناطقها

في حال تغيير المناطق المحدَّدة التي تتعامل مع حركة بيانات الإنتاج، فيمكنك منع فقدان الحدث من خلال تنفيذ هذه الخطوات بالترتيب:

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

على سبيل المثال، إذا كانت لديك دالة اسمها webhook موجودة حاليًا في منطقة الدوال التلقائية في us-central1 وأردت نقلها إلى asia-northeast1، عليك أولاً تعديل الرمز المصدر لإعادة تسمية الدوال ومراجعة المنطقة.

// before
const functions = require('firebase-functions/v1');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions/v1');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

بعد ذلك، يمكنك نشر التطبيق من خلال تنفيذ:

firebase deploy --only functions:webhookAsia

هناك الآن دالتَان متطابقتان قيد التشغيل: يتم تشغيل webhook في us-central1، ويتم تشغيل webhookAsia في asia-northeast1.

بعد ذلك، يمكنك حذف webhook:

firebase functions:delete webhook

تتوفّر الآن دالة واحدة فقط، وهي webhookAsia، التي يتم تشغيلها في asia-northeast1.

تغيير نوع عامل تشغيل الدالة

أثناء تطوير عملية نشر Cloud Functions for Firebase بمرور الوقت، قد تحتاج إلى تغيير نوع عامل تشغيل الدالة لأسباب مختلفة. على سبيل المثال، قد تحتاج إلى تغيير نوع من أحداث Firebase Realtime Database أو Cloud Firestore إلى نوع آخر.

لا يمكن تغيير نوع حدث الدالة من خلال تغيير الرمز المصدر وتشغيل firebase deploy فقط. لتجنُّب الأخطاء، غيِّر نوع عامل تشغيل الدالة باتّباع هذه الخطوات:

  1. عدِّل رمز المصدر لتضمين دالة جديدة بنوع المشغِّل المطلوب.
  2. يمكنك نشر الدالة، ما يؤدي إلى تشغيل كلّ من الدالة القديمة والجديدة مؤقتًا.
  3. احذف الدالة القديمة صراحةً من قناة الإصدار العلني باستخدام Firebase CLI.

على سبيل المثال، إذا كانت لديك دالة Node.js باسم objectChanged تتضمّن نوع الحدث التقليدي onChange وأردت تغييره إلى onFinalize، عليك أولاً إعادة تسمية الدالة وتعديلها لتضمين نوع الحدث onFinalize.

// before
const functions = require('firebase-functions/v1');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions/v1');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

بعد ذلك، شغِّل الأوامر التالية لإنشاء الدالة الجديدة أولاً، قبل حذف الدالة القديمة:

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

ضبط خيارات وقت التشغيل

يتيح لك Cloud Functions for Firebase تحديد خيارات بيئة التشغيل، مثل Node.js. إصدار وقت التشغيل ومهلة كل دالة، وتخصيص الذاكرة، والحد الأدنى/الحد الأقصى لمثيلات الوظائف.

من بين أفضل الممارسات، يجب ضبط هذه الخيارات (باستثناء إصدار Node.js) على كائن تهيئة داخل رمز الدالة. هذا النمط RuntimeOptions هو مصدر الحقيقة لخيارات وقت تشغيل الدالة، إلغاء الخيارات التي تم ضبطها باستخدام أي طريقة أخرى (مثل استخدام "وحدة تحكُّم Google Cloud" أو gcloud CLI).

إذا كان سير عمل التطوير يتضمّن ضبط خيارات وقت التشغيل يدويًا من خلال Google Cloud Console أو واجهة سطر أوامر gcloud CLI ولا تريد أن يتم تجاوز هذه القيم في كل عملية نشر، اضبط الخيار preserveExternalChanges على true. عند ضبط هذا الخيار على true، يدمج Firebase خيارات وقت التشغيل المعيّنة في بإعدادات النسخة المنشورة حاليًا من الدالة الأولوية التالية:

  1. تم ضبط الخيار في رمز الدوال: يمكنك إلغاء التغييرات الخارجية.
  2. تم ضبط الخيار على RESET_VALUE في رمز الدوال: يمكنك إلغاء التغييرات الخارجية باستخدام القيمة التلقائية.
  3. لم يتم ضبط الخيار في رمز الدوال، ولكن تم ضبطه في دالة منشورة حاليًا: استخدِم الخيار المحدّد في الدالة المنشورة.

لا يُنصح باستخدام الخيار preserveExternalChanges: true في معظم السيناريوهات لأنّه لن يعود الرمز المصدر الكامل للحقائق حول خيارات وقت التشغيل لوظائفك. في حال استخدامها، يمكنك الانتقال إلى Google Cloud Console أو استخدام gcloud CLI لعرض الإعداد الكامل للدالة.

ضبط إصدار Node.js

تسمح حزمة تطوير البرامج (SDK) لنظام التشغيل Firebase لنظام التشغيل Cloud Functions باختيار وقت تشغيل Node.js. يمكنك اختيار تشغيل جميع الدوالّ في مشروع حصريًا على بيئة وقت التشغيل المتوافقة مع أحد إصدارات Node.js المتوافقة التالية:

  • Node.js 20 (معاينة)
  • Node.js 18
  • Node.js 16
  • Node.js 14

لضبط إصدار Node.js:

يمكنك ضبط الإصدار في حقل engines في ملف package.json الذي تم إنشاؤه في دليل functions/ أثناء الإعداد. على سبيل المثال، لاستخدام فقط الإصدار 18، عدِّل هذا السطر في "package.json":

  "engines": {"node": "18"}

إذا كنت تستخدم مدير حِزم Yarn أو كانت لديك متطلبات محدّدة أخرى لمحاولة حقل engines، يمكنك ضبط وقت التشغيل لحزمة SDK الخاصة بنظام التشغيل Firebase لنظام التشغيل Cloud Functions في firebase.json بدلاً من ذلك:

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
    }
  }

يستخدم واجهة سطر الأوامر القيمة المحددة في firebase.json بالتفضيل لأي قيمة أو نطاق تضبطه بشكل منفصل في package.json.

ترقية وقت تشغيل Node.js

لترقية بيئة تشغيل Node.js:

  1. تأكد من أن مشروعك على خطة أسعار Blaze:
  2. يُرجى التأكّد من استخدام الإصدار 11.18.0 من واجهة سطر الأوامر Firebase أو إصدار أحدث.
  3. غيِّر قيمة engines في ملف package.json الذي تم إنشاؤه في directory functions/ أثناء الإعداد. على سبيل المثال، إذا كنت بصدد الترقية من الإصدار 16 إلى الإصدار 18، فإن إدخال من المفترض أن يظهر على النحو التالي: "engines": {"node": "18"}
  4. يمكنك اختياريًا اختبار التغييرات باستخدام الرمز Firebase Local Emulator Suite.
  5. أعِد نشر جميع الدوال.

التحكّم في سلوك التكبير/التصغير

يُعدِّل Cloud Functions for Firebase تلقائيًا عدد النُسخ التي تعمل استنادًا إلى عدد الطلبات الواردة، وقد ينخفض عدد النُسخ التي تعمل إلى صفر في أوقات انخفاض عدد الزيارات. ومع ذلك، إذا كان تطبيقك يتطلب أسعارًا مخفَّضة وقت الاستجابة وأردت تقليل عدد عمليات التشغيل على البارد، يمكنك تغيير السلوك الافتراضي عن طريق تحديد حد أدنى لعدد مثيلات الحاوية التي سيتم دافئ وجاهزًا لتقديم الطلبات.

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

تقليل عدد عمليات التشغيل على البارد

لضبط الحد الأدنى لعدد المثيلات لدالة في رمز المصدر، استخدم runWith . تقبل هذه الطريقة كائن JSON متوافقًا مع واجهة RuntimeOptions ، والتي تحدّد قيمة minInstances. على سبيل المثال: تضبط هذه الدالة 5 مثيلات على الأقل للحفاظ على الدفء:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

في ما يلي بعض الأمور التي يجب مراعاتها عند ضبط قيمة لسمة minInstances:

  • إذا وسّع Cloud Functions for Firebase نطاق تطبيقك فوق الإعداد minInstances، سيكون هناك تشغيل متأخر على البارد لكلّ نسخة فوق هذا الحدّ.
  • ويُرجى العِلم بأنّ عمليات البدء الباردة لها أشد تأثير في التطبيقات التي تشهد حركة مرور حادة. إذا كان يشهد تطبيقك زيادة كبيرة في عدد الزيارات وقد ضبطت قيمة minInstances عالية بما يكفي ينخفض عدد مرات التشغيل على البارد عند كل زيادة في عدد الزيارات، وستلاحظ زيادة كبيرة زمن انتقال منخفض بالنسبة إلى التطبيقات ذات حركة المرور المستمرة، لا يتم إجراء عمليات التشغيل على البارد من المرجح أن يؤثر ذلك بشكل كبير في الأداء.
  • قد يكون من المنطقي ضبط الحد الأدنى لعدد النُسخ في بيئات الإنتاج، ولكن ينبغي عادةً تجنُّب ذلك في بيئات الاختبار. للانتقال إلى الصفر في اختبار المشروع مع الاستمرار في تقليل عمليات التشغيل على البارد في مشروع الإنتاج، يمكن ضبط minInstances استنادًا إلى متغير البيئة FIREBASE_CONFIG:

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

الحد من الحد الأقصى لعدد النُسخ لدالة

لضبط الحد الأقصى لعدد المثيلات في رمز المصدر للدالة، استخدِم الأسلوب runWith . تقبل هذه الطريقة كائن JSON متوافقًا مع واجهة RuntimeOptions التي تحدِّد قيمًا لـ maxInstances. على سبيل المثال، تضبط هذه الدالة حدًا أقصى يبلغ 100 مثيل لتجنّب زيادة عدد القيم في قاعدة بيانات قديمة افتراضية:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

في حال زيادة حجم دالة HTTP إلى الحد الأقصى maxInstances، يتم تنفيذ الطلبات الجديدة تم وضعه في قائمة الانتظار لمدة 30 ثانية ثم تم رفضه مع رمز الاستجابة 429 Too Many Requests في حال عدم توفّر أي مثيل بحلول ذلك الوقت.

للاطّلاع على مزيد من المعلومات عن أفضل الممارسات لاستخدام إعدادات الحدّ الأقصى للمثيلات، يُرجى الاطّلاع على الخروج من هذه أفضل الممارسات لاستخدام "maxInstances"

ضبط المهلة وتخصيص الذاكرة

في بعض الحالات، قد يكون لدوالّك متطلبات خاصة لقيمة مهلة طويلة أو تخصيص مساحة كبيرة من الذاكرة. يمكنك ضبط هذه القيم في Google Cloud Console أو في رمز المصدر للدالة (Firebase فقط).

لضبط تخصيص الذاكرة ومهلة في رمز المصدر للدوال، استخدِم runWith تم تقديم معلَمة في Firebase SDK للإصدار 2.0.0 من Cloud Functions. يقبل خيار وقت التشغيل هذا كائن JSON متوافقًا مع واجهة RuntimeOptions التي تحدّد قيمتَي timeoutSeconds وmemory. على سبيل المثال، تستخدم دالة التخزين هذه ذاكرة بسعة 1 غيغابايت وتنتهي مهلتها بعد 300 ثانية:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

الحد الأقصى لقيمة timeoutSeconds هو 540، أو 9 دقائق. يتجاوب مقدار الذاكرة الممنوحة لدالة مع وحدة المعالجة المركزية المخصصة للدالة، كما هو موضح في قائمة القيم الصالحة هذه للدالة memory:

  • 128MB - 200 ميغاهرتز
  • 256MB — 400 ميغاهرتز
  • 512MB - ‎800MHz
  • 1GB: 1.4 غيغاهرتز
  • 2GB - ‎2.4 GHz
  • 4GB - ‫4.8 غيغاهرتز
  • 8GB - ‫4.8 غيغاهرتز

لضبط إعدادات تخصيص الذاكرة والمهلة في وحدة تحكُّم Google Cloud، اتّبِع الخطوات التالية:

  1. في وحدة تحكُّم Google Cloud في Google، اختَر Cloud Functions من القائمة. القائمة اليمنى.
  2. حدد دالة عن طريق النقر فوق اسمها في قائمة الدوال.
  3. انقر على رمز تعديل في القائمة العلوية.
  4. اختَر أحد التخصيصات للذاكرة من القائمة المنسدلة التي تحمل التصنيف الذاكرة المخصّصة.
  5. انقر على المزيد لعرض الخيارات المتقدمة، وأدخل عدد الثواني في مربع نص المهلة.
  6. انقر على حفظ لتعديل الدالة.