يمكنك نشر الدوال وحذفها وتعديلها باستخدام Firebase أوامر سطر الأوامر أو من خلال ضبط خيارات وقت التشغيل في رمز مصدر الدوال.
نشر الدوالّ
لنشر الدوالّ، نفِّذ الأمر التالي لواجهة سطر أوامر Firebase:
firebase deploy --only functions
بشكلٍ تلقائي، تنشر واجهة برمجة التطبيقات Firebase CLI جميع الدوالّ داخل
مصدرك في الوقت نفسه. إذا كان مشروعك يحتوي على أكثر من 5 دوال،
ننصحك باستخدام العلامة --only
مع أسماء دوال محدّدة
لنشر الدوال التي
حرّرتها فقط. يؤدي نشر وظائف معيّنة
بهذه الطريقة إلى تسريع عملية النشر ومساعدتك في تجنّب مواجهة quot;الحصص القصوى للنشر". على سبيل المثال:
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
تغيير منطقة أو مناطق الدالة
إذا كنت تغيّر المناطق المحدّدة لصيغة تدخّل في الزيارات العلنية، يمكنك منع فقدان الأحداث من خلال تنفيذ الخطوات التالية بالترتيب:
- أعِد تسمية الدالة، وغيِّر منطقتها أو مناطقها على النحو المطلوب.
- يمكنك نشر الدالة التي تمت إعادة تسميتها، ما يؤدي إلى تشغيل الرمز البرمجي نفسه مؤقتًا في كلتا مجموعتَي المناطق.
- احذف الدالة السابقة.
على سبيل المثال، إذا كانت لديك دالة
اسمها 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
فقط. لتجنُّب حدوث أخطاء،
يمكنك تغيير نوع عامل تشغيل الدالة باتّباع الإجراء التالي:
- عدِّل الرمز المصدر لتضمين دالة جديدة بنوع العامل المشغِّل المطلوب.
- يمكنك نشر الدالة، ما يؤدي إلى تشغيل كلّ من الدالة القديمة والجديدة مؤقتًا.
- احذف الدالة القديمة صراحةً من قناة الإصدار العلني باستخدام 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 خيارات وقت التشغيل التي تم ضبطها في
الرمز البرمجي مع إعدادات الإصدار المنشور حاليًا من الدالة باستخدام
الأولوية التالية:
- يتم ضبط الخيار في رمز الدوال: إلغاء التغييرات الخارجية.
- تم ضبط الخيار على
RESET_VALUE
في رمز الدوال: إلغاء التغييرات الخارجية باستخدام القيمة التلقائية. - لم يتم ضبط الخيار في رمز الدوال، ولكن تم ضبطه في الدالة المنشورة حاليًا: استخدِم الخيار المحدّد في الدالة المنشورة.
لا يُنصح
باستخدام الخيار 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
}
}
يستخدم CLI القيمة المحدّدة في firebase.json
بدلاً من أي قيمة أو
نطاق تحدّده بشكل منفصل في package.json
.
ترقية وقت تشغيل Node.js
لترقية وقت تشغيل Node.js، اتّبِع الخطوات التالية:
- تأكَّد من أنّ مشروعك يستخدم خطة أسعار Blaze.
- تأكَّد من استخدام الإصدار 11.18.0 أو إصدار أحدث من Firebase CLI.
- غيِّر قيمة
engines
في ملفpackage.json
الذي تم إنشاؤه في directoryfunctions/
أثناء الإعداد. على سبيل المثال، إذا كنت تريد الترقية من الإصدار 16 إلى الإصدار 18، يجب أن يظهر الإدخال على النحو التالي:"engines": {"node": "18"}
- يمكنك اختياريًا اختبار التغييرات باستخدام الرمز Firebase Local Emulator Suite.
- أعِد نشر جميع الدوالّ.
التحكّم في سلوك التكبير/التصغير
يُعدِّل 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 GHz4GB
- 4.8 غيغاهرتز8GB
- 4.8 غيغاهرتز
لضبط تخصيص الذاكرة والمهلة في وحدة تحكّم Google Cloud:
- في وحدة تحكّم Google Google Cloud، اختَر Cloud Functions من القائمة على يمين الصفحة.
- اختَر دالة من خلال النقر على اسمها في قائمة الدوال.
- انقر على رمز تعديل في القائمة العلوية.
- اختَر مساحة تخصيص ذاكرة من القائمة المنسدلة التي تحمل الاسم المساحة المخصّصة للذاكرة.
- انقر على المزيد لعرض الخيارات المتقدّمة، وأدخِل عددًا من الثواني في مربّع نص المهلة.
- انقر على حفظ لتعديل الدالة.