נהל פריסת פונקציות ואפשרויות זמן ריצה

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

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

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

firebase deploy --only functions

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

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

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

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

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

מחק פונקציות

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

  • במפורש ב-Firebase CLI עם functions:delete
  • במפורש ב- Google Cloud Console .
  • משתמע על ידי הסרת הפונקציה מ- index.js לפני הפריסה.

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

מחיקת פונקציות מפורשת ב-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 index.js מהייצור כל פונקציה שהוסרו מהקובץ.

שנה שם, אזור או טריגר של פונקציה

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

שנה שם של פונקציה

כדי לשנות שם של פונקציה, צור גרסה שונה של הפונקציה ב- index.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 northeast1.

לאחר מכן, מחק webhook :

firebase functions:delete webhook

כעת יש רק פונקציה אחת - webhookAsia , שפועלת asia-northeast1 .

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

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

  • שנה מאירוע האחסון מדור קודם ב- onFinalize onChange onDelete , onArchive ו- onMetadataUpdate . (למידע נוסף על כך במדריך השדרוג של בטא ל-v1 או v2 ).
  • שנה מסוג אחד של אירוע Firebase Realtime Database או Cloud Firestore לאירוע אחר, כגון אירוע onWrite הגנרי לאירוע onCreate המפורט.

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

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

לדוגמה, אם הייתה לך פונקציה 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

Firebase SDK for Cloud Functions 2.0.0 ומעלה מאפשר מבחר זמן ריצה של Node.js. אתה יכול לבחור להפעיל את כל הפונקציות בפרויקט אך ורק בסביבת זמן הריצה המתאימה לאחת מגרסאות Node.js הנתמכות הבאות:

  • Node.js 16
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (הוצא משימוש ב-8 ביוני 2020) פריסת פונקציות לזמן הריצה של Node.js 8 הושבתה ב-Firebase CLI ב-15 בדצמבר 2020. ביצוע פונקציות שכבר פרסו תיעצר בשלב מסוים בעתיד; אם פרסתם פונקציות לזמן הריצה של Node.js 8, אנו ממליצים לשדרג לזמן הריצה של Node.js 16 .

כדי להגדיר את גרסת Node.js:

הגדר את הגרסה בשדה engines בקובץ package.json שנוצר בספריית functions/ שלך במהלך האתחול. לדוגמה, כדי להשתמש רק בגרסה 16, ערוך את השורה הזו ב- package.json :

  "engines": {"node": "16"}

תחום engines נדרש; עליו לציין אחת מגרסאות ה-Node.js הנתמכות כדי שתוכל לפרוס ולהפעיל פונקציות. נכון לעכשיו firebase init functions של Firebase מגיבות שדה זה ל 16 .

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

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

  1. ודא שהפרויקט שלך נמצא בתוכנית התמחור של Blaze .
  2. ודא שאתה משתמש ב-Firebase CLI v9.17.0 ואילך.
  3. שנה את ערך engines בקובץ package.json שנוצר בספריית functions/ שלך במהלך האתחול. לדוגמה, אם אתה משדרג מגרסה 10 לגרסה 16, הערך צריך להיראות כך: "engines": {"node": "16"}
  4. לחלופין, בדוק את השינויים שלך באמצעות Firebase Local Emulator Suite .
  5. פריס מחדש של פונקציות באמצעות Firebase CLI v9.17.0 ואילך.

שליטה בהתנהגות קנה המידה

כברירת מחדל, 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 . לדוגמה, פונקציית אחסון זו משתמשת ב-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 - 200MHz
  • 256MB - 400MHz
  • 512MB - 800MHz
  • 1GB - 1.4 GHz
  • 2GB - 2.4 GHz
  • 4GB - 4.8 GHz
  • 8GB - 4.8 GHz

כדי להגדיר הקצאת זיכרון וזמן קצוב ב-Google Cloud Console:

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