אפשר לפרוס, למחוק ולשנות פונקציות באמצעות פקודות CLI של Firebase או על ידי הגדרת אפשרויות של זמן ריצה בקוד המקור של הפונקציות.
פריסת פונקציות
כדי לפרוס פונקציות, מריצים את פקודת ה-CLI הבאה של Firebase:
firebase deploy --only functions
כברירת מחדל, CLI של Firebase פורס את כל הפונקציות שבמקור בו-זמנית. אם הפרויקט מכיל יותר מ-5 פונקציות, מומלץ להשתמש בדגל --only
עם שמות פונקציות ספציפיים כדי לפרוס רק את הפונקציות שערכתם. פריסה של פונקציות ספציפיות בדרך הזו מזרזת את תהליך הפריסה ומונעת מצב שבו תגיעו למכסות הפריסה. לדוגמה:
firebase deploy --only functions:addMessage,functions:makeUppercase
כשפורסים מספר גדול של פונקציות, יכול להיות שתחרגו מהמכסה הרגילה ותקבלו הודעות שגיאה מסוג HTTP 429 או 500. כדי לפתור את הבעיה, כדאי לפרוס פונקציות בקבוצות של 10 פונקציות או פחות.
במאמרי העזרה של CLI של Firebase יש רשימה מלאה של הפקודות הזמינות.
כברירת מחדל, ה-CLI של Firebase מחפש את קוד המקור בתיקייה functions/
. אם מעדיפים, אפשר לארגן פונקציות במסדי קוד או בכמה קבוצות של קבצים.
מחיקת פונקציות
אפשר למחוק פונקציות שפרסמתם בעבר בדרכים הבאות:
- באופן מפורש ב-CLI של Firebase באמצעות
functions:delete
- בצורה מפורשת במסוף Google Cloud.
- באופן משתמע על ידי הסרת הפונקציה מהמקור לפני הפריסה.
בכל פעולת מחיקה תתבקשו לאשר לפני הסרת הפונקציה מסביבת הייצור.
מחיקה מפורשת של פונקציה ב-CLI של 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
מנתח את המקור ומסיר מהייצור את כל הפונקציות שהוסרו מהקובץ.
שינוי השם, האזור או הטריגר של פונקציה
אם אתם משנים את השם או את האזורים או את הטריגר של פונקציות שמטפלות בתנועה בסביבת הייצור, עליכם לפעול לפי השלבים שמפורטים בקטע הזה כדי להימנע מאובדן אירועים במהלך השינוי. לפני שמבצעים את השלבים האלה, צריך לוודא שהפונקציה עקבית, כי גם הגרסה החדשה וגם הגרסה הישנה של הפונקציה יפעלו בו-זמנית במהלך השינוי.
שינוי שם של פונקציה
כדי לשנות את השם של פונקציה, יוצרים גרסה חדשה של הפונקציה עם השם החדש במקור, ואז מריצים שתי פקודות פריסה נפרדות. הפקודה הראשונה פורסת את הפונקציה עם השם החדש, והפקודה השנייה מסירה את הגרסה שפרסמתם בעבר. לדוגמה, אם יש לכם פונקציה של 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
. כדי למנוע שגיאות, כך תוכלו לשנות את סוג הטריגר של פונקציה:
- משנים את קוד המקור כך שיכלול פונקציה חדשה עם סוג הטריגר הרצוי.
- פורסים את הפונקציה, וכתוצאה מכך הן הפונקציה הישנה והן הפונקציה החדשה מופעלות באופן זמני.
- מוחקים את הפונקציה הישנה מהייצור באופן מפורש באמצעות CLI של Firebase.
לדוגמה, אם יש לכם פונקציית 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 או ה-CLI של gcloud).
אם תהליך הפיתוח שלכם כולל הגדרה ידנית של אפשרויות בסביבת זמן הריצה דרך מסוף Google Cloud או ה-CLI של gcloud, ואתם לא רוצים שהערכים האלה יבוטל בכל פריסה, צריך להגדיר את האפשרות preserveExternalChanges
לערך true
.
אם האפשרות הזו מוגדרת ל-true
, מערכת Firebase ממזגת את האפשרויות בסביבת זמן הריצה שהוגדרו בקוד עם ההגדרות של הגרסה הנוכחית של הפונקציה שנפרסה, עם העדיפות הבאה:
- האפשרות מוגדרת בקוד הפונקציות: שינוי של שינויים חיצוניים.
- האפשרות מוגדרת כ-
RESET_VALUE
בקוד הפונקציות: שינוי חיצוני יבוטל על ידי ערך ברירת המחדל. - האפשרות לא מוגדרת בקוד הפונקציות, אבל היא מוגדרת בפונקציה הנוכחית שנפרסה: משתמשים באפשרות שצוינה בפונקציה שנפרסה.
לא מומלץ להשתמש באפשרות preserveExternalChanges: true
ברוב התרחישים, כי הקוד לא יהיה יותר המקור המלא לאמת לגבי אפשרויות זמן הריצה של הפונקציות. אם אתם משתמשים בה, תוכלו לבדוק את ההגדרה המלאה של הפונקציה במסוף Google Cloud או באמצעות ה-CLI של gcloud.
הגדרת גרסת 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
, תוכלו להגדיר את זמן הריצה של Firebase SDK של Cloud Functions ב-firebase.json
במקום זאת:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
ה-CLI משתמש בערך שמוגדר ב-firebase.json
במקום בערך או בטווח שתגדירו בנפרד ב-package.json
.
שדרוג זמן הריצה של Node.js
כדי לשדרג את זמן הריצה של Node.js:
- מוודאים שהפרויקט שלכם מוגדר לתוכנית התמחור Blaze.
- חשוב לוודא שאתם משתמשים ב-Firebase CLI בגרסה 11.18.0 ואילך.
- משנים את הערך של
engines
בקובץpackage.json
שנוצר בספרייהfunctions/
במהלך האתחול. לדוגמה, אם משדרגים מגרסה 16 לגרסה 18, הרשומה צריכה להיראות כך:"engines": {"node": "18"}
- אפשר גם לבדוק את השינויים באמצעות Firebase Local Emulator Suite.
- פורסים מחדש את כל הפונקציות.
שליטה בהתנהגות של שינוי קנה מידה
כברירת מחדל, Cloud Functions for Firebase משתנה בהתאם למספר הבקשות הנכנסות, כך שיכול להיות שהוא יגיע לאפס מכונות בזמנים של תנועה מופחתת. עם זאת, אם האפליקציה שלכם דורשת זמן אחזור קצר יותר ואתם רוצים להגביל את מספר ההפעלות מחדש, תוכלו לשנות את התנהגות ברירת המחדל הזו על ידי ציון מספר מינימלי של מכונות קונטיינר שיישמרו במצב פעילות מוכנה כדי להגיש בקשות.
באופן דומה, אפשר להגדיר מספר מקסימלי כדי להגביל את ההתאמה לעומס (scaling) של המכונות בתגובה לבקשות נכנסות. תוכלו להשתמש בהגדרה הזו כדי לשלוט בעלויות או להגביל את מספר החיבורים לשירות גיבוי, כמו למסד נתונים.
צמצום מספר ההפעלות הקרות
כדי להגדיר את המספר המינימלי של המופעים של פונקציה בקוד המקור, משתמשים ב-method 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
, בכל מכונה תופיע הפעלה במצב התחלתי (cold start) מעל הסף הזה. - הפעלה במצב התחלתי (cold start) משפיעה בצורה הכי חמורה על אפליקציות עם תנועה קוצנית. אם באפליקציה יש תנועה חדה, והגדרתם ערך
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 או בקוד המקור של הפונקציה (ב-Firebase בלבד).
כדי להגדיר הקצאת זיכרון וטיימר תפוגה בקוד המקור של הפונקציות, משתמשים בפרמטר runWith
שהוצג ב-Firebase SDK לגרסה Cloud Functions 2.0.0. אפשרות סביבת זמן הריצה הזו מקבלת אובייקט JSON שתואם לממשק RuntimeOptions
, שמגדיר ערכים ל-timeoutSeconds
ול-memory
.
לדוגמה, פונקציית האחסון הזו משתמשת ב-1GB של זיכרון ותקופת הקצוב לתפוגה שלה היא 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 דקות.
כמות הזיכרון שמוענקת לפונקציה תואמת למעבד (CPU) שהוקצה לפונקציה, כפי שמפורט ברשימת הערכים התקינים של memory
:
128MB
— 200MHz256MB
— 400MHz512MB
— 800MHz1GB
— 1.4GHz2GB
– 2.4GHz4GB
— 4.8GHz8GB
— 4.8GHz
כדי להגדיר הקצאת זיכרון וזמן קצוב לתפוגה במסוף Google Cloud:
- במסוף Google Google Cloud, בוחרים באפשרות Cloud Functions בתפריט הימני.
- בוחרים פונקציה על ידי לחיצה על השם שלה ברשימת הפונקציות.
- לוחצים על הסמל עריכה בתפריט העליון.
- בוחרים הקצאת זיכרון מהתפריט הנפתח עם התווית הקצאת זיכרון.
- לוחצים על עוד כדי להציג את האפשרויות המתקדמות, ומזינים מספר שניות בתיבה Timeout.
- כדי לעדכן את הפונקציה, לוחצים על Save.