Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

אתה יכול לפרוס, למחוק ולשנות פונקציות באמצעות פקודות 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 עבור הרשימה המלאה של פקודות זמינות.

כברירת מחדל, Firebase CLI נראית באור functions/ התיקייה עבור קוד המקור. אתה יכול לציין תיקייה אחרת על ידי הוספת השורות הבאות ב firebase.json :

"functions": {
  "source": "another-folder"
}

מחק פונקציות

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

  • במפורש Firebase CLI עם functions:delete
  • במפורש באמצעות תפריט ההקשר של רשימת הפונקציות במסוף Firebase
  • במרומז על ידי הסרת הפונקציה 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 ומסיר מייצור כול פונקציות אשר הוסרו המקובץ.

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

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

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

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

ואז, מחיקת webhook :

$ firebase functions:delete webhook

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

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

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

  • שינוי מן האחסון מורשת onChange האירוע onFinalize , onDelete , onArchive , ו onMetadataUpdate . (למידע נוסף על זה בטא מדריך שדרוג v1 או v2 ).
  • שינוי מסוג אחד של מסד Firebase זמן אמת או ענן 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. ביצוע של פונקציות שכבר פרוסים יפסיקו בשלב כלשהו בעתיד; אם פרסת פונקציות על ריצת 8 Node.js, אנו ממליצים לשדרג ריצת 14 Node.js .

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

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

  "engines": {"node": "14"}

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

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

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

  1. ודא הפרויקט שלך הוא על תוכנית התמחור Blaze .
  2. ודא שאתה משתמש ב-Firebase CLI v8.6.0 ואילך.
  3. שנו את engines ערך package.json הקובץ שנוצר שלך functions/ בעת אתחול בספרייה. לדוגמא, אם אתה משדרג מגרסה 10 לגרסה 14, הכניסה אמורה להיראות כך: "engines": {"node": "14"}
  4. לחלופין, לבדוק את השינויים שלך באמצעות Suite Emulator המקומי Firebase .
  5. פריס מחדש של פונקציות באמצעות Firebase CLI v8.1.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 :

  • אם פונקציות ענן עבור 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 עבור ענן פונקציות 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 Console:

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