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


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

دوال النشر

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

firebase deploy --only functions

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

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

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

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

يبحث Firebase CLI تلقائيًا في مجلد functions/ عن رمز المصدر. يمكنك تنظيم الدوالّ في قواعد بيانات أو مجموعات متعدّدة من الملفات إذا كنت تفضّل ذلك.

حذف الدوالّ

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

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

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

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

# 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 المصدر ويزيل من الإنتاج أي دوال تمت إزالتها من الملف.

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

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

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

لإعادة تسمية دالة، أنشئ نسخة جديدة من الدالة في المصدر باسم جديد، ثم نفِّذ أمرَي نشر منفصلَين. ينشر الأمر الأول الدالة المُسمّاة حديثًا، ويزيل الأمر الثاني الإصدار الذي تم نشره سابقًا. على سبيل المثال، إذا كانت لديك دالة 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 أو استخدِم 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
    }
  }

يستخدم CLI القيمة المحدّدة في 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 التي تم تقديمها في حزمة تطوير البرامج (SDK) لنظام التشغيل Firebase لإصدار Cloud Functions 2.0.0. يقبل خيار بيئة التشغيل هذا كائن 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 غيغاهرتز
  • 4GB: 4.8 غيغاهرتز
  • 8GB: 4.8 غيغاهرتز

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

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