ניהול פונקציות


אתה יכול לפרוס, למחוק ולשנות פונקציות באמצעות פקודות Firebase CLI או על ידי הגדרת אפשרויות זמן ריצה בקוד המקור של הפונקציות שלך.

פריסת פונקציות

כדי לפרוס פונקציות, הפעל את פקודת Firebase CLI זו:

firebase deploy --only functions

כברירת מחדל, Firebase CLI פורס את כל הפונקציות בתוך המקור שלך בו-זמנית. אם הפרוייקט שלך מכיל יותר מ-5 פונקציות, אנו ממליצים להשתמש בדגל --only עם שמות פונקציות ספציפיים כדי לפרוס רק את הפונקציות שערכת. פריסת פונקציות ספציפיות בדרך זו מזרזת את תהליך הפריסה ומסייעת לך להימנע מלהיתקל במכסות פריסה. לדוגמה:

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

בעת פריסת מספר רב של פונקציות, אתה עלול לחרוג מהמכסה הסטנדרטית ולקבל הודעות שגיאה HTTP 429 או 500. כדי לפתור זאת, פרוס פונקציות בקבוצות של 10 או פחות.

עיין בהפניה של Firebase CLI לרשימה המלאה של הפקודות הזמינות.

כברירת מחדל, ה-CLI של Firebase מחפש functions/ פונקציות אחר קוד המקור. אם אתה מעדיף, אתה יכול לארגן פונקציות בבסיסי קוד או בקבוצות מרובות של קבצים.

מחק פונקציות

אתה יכול למחוק פונקציות שנפרסו בעבר בדרכים הבאות:

  • במפורש ב-Firebase CLI עם functions:delete
  • במפורש במסוף Google Cloud .
  • באופן מרומז על ידי הסרת הפונקציה מהמקור לפני הפריסה.

כל פעולות המחיקה מבקשות ממך לאשר לפני הסרת הפונקציה מהייצור.

מחיקת פונקציות מפורשת ב-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');

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

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

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');

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

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

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 .

שנה את סוג ההפעלה של פונקציה

בזמן שאתה מפתח את פונקציות הענן עבור Firebase שלך ​​לאורך זמן, ייתכן שיהיה עליך לשנות את סוג ההפעלה של פונקציה מסיבות שונות. לדוגמה, ייתכן שתרצה לשנות מסוג אחד של מסד נתונים בזמן אמת של Firebase או אירוע Cloud Firestore לסוג אחר.

לא ניתן לשנות את סוג האירוע של פונקציה רק ​​על ידי שינוי קוד המקור והפעלת firebase deploy . כדי למנוע שגיאות, שנה את סוג ההפעלה של פונקציה על ידי הליך זה:

  1. שנה את קוד המקור כך שיכלול פונקציה חדשה עם סוג הטריגר הרצוי.
  2. פרוס את הפונקציה, מה שגורם להרצה זמנית של הפונקציות הישנות והחדשות.
  3. מחק במפורש את הפונקציה הישנה מהייצור באמצעות Firebase CLI.

לדוגמה, אם הייתה לך פונקציה Node.js בשם objectChanged שיש לה את סוג האירוע onChange מדור קודם, וברצונך לשנות אותה ל- onFinalize , תחילה שנה את שם הפונקציה וערוך אותה כך שתהיה לה סוג האירוע onFinalize .

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

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

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

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 או gcloud CLI ואתה לא רוצה שערכים אלה יעקפו בכל פריסה, הגדר את האפשרות preserveExternalChanges ל- true . כאשר אפשרות זו מוגדרת כ- true , Firebase ממזג את אפשרויות זמן הריצה המוגדרות בקוד שלך עם ההגדרות של הגרסה הנפרסת כעת של הפונקציה שלך עם העדיפות הבאה:

  1. האפשרות מוגדרת בקוד הפונקציות: לעקוף שינויים חיצוניים.
  2. האפשרות מוגדרת ל- RESET_VALUE בקוד הפונקציות: עוקף שינויים חיצוניים עם ערך ברירת המחדל.
  3. אפשרות לא מוגדרת בקוד הפונקציות, אלא מוגדרת בפונקציה שנפרסה כעת: השתמש באפשרות המצוינת בפונקציה הפרוסה.

שימוש באפשרות preserveExternalChanges: true אינה מומלצת עבור רוב התרחישים מכיוון שהקוד שלך כבר לא יהיה מקור האמת המלא לאפשרויות זמן ריצה עבור הפונקציות שלך. אם אתה כן משתמש בו, בדוק את מסוף Google Cloud או השתמש ב-gcloud CLI כדי להציג את התצורה המלאה של פונקציה.

הגדר את גרסת Node.js

Firebase SDK for 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 for Cloud Functions ב- firebase.json במקום זאת:

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

ה-CLI משתמש בערך שהוגדר ב- firebase.json בהעדפה לכל ערך או טווח שתגדיר בנפרד ב- package.json .

שדרג את זמן הריצה של Node.js

כדי לשדרג את זמן הריצה של Node.js:

  1. ודא שהפרויקט שלך נמצא בתוכנית התמחור של Blaze .
  2. ודא שאתה משתמש ב-Firebase CLI v11.18.0 ואילך.
  3. שנה את ערך engines בקובץ package.json שנוצר בספריית 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 for 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 דקות. כמות הזיכרון המוענקת לפונקציה תואמת למעבד המוקצה לפונקציה, כמפורט ברשימת הערכים החוקיים של memory :

  • 128MB - 200MHz
  • 256MB - 400MHz
  • 512MB - 800MHz
  • 1GB - 1.4 GHz
  • 2GB - 2.4 GHz
  • 4GB - 4.8 GHz
  • 8GB - 4.8 GHz

כדי להגדיר הקצאת זיכרון וזמן קצוב במסוף של Google Cloud:

  1. במסוף Google Google Cloud בחר ב- Cloud Functions מהתפריט השמאלי.
  2. בחר פונקציה על ידי לחיצה על שמה ברשימת הפונקציות.
  3. לחץ על סמל העריכה בתפריט העליון.
  4. בחר הקצאת זיכרון מהתפריט הנפתח שכותרתו זיכרון מוקצה .
  5. לחץ על עוד כדי להציג את האפשרויות המתקדמות, והזן מספר שניות בתיבת הטקסט פסק זמן .
  6. לחץ על שמור כדי לעדכן את הפונקציה.