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

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

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

מחיקת פונקציות מפורשות ב- 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 מנתח 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. מחק במפורש את הפונקציה הישנה מהייצור באמצעות CLI Firebase.

לדוגמא, אם היה לך פונקציה 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 עבור Cloud Functions 2.0.0 ומעלה מאפשרת בחירה של זמן ריצה של Node.js. אתה יכול לבחור להפעיל את כל הפונקציות בפרויקט אך ורק בסביבת זמן הריצה המתאימה לאחת מגרסאות הנתמכות של Node.js:

  • 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 ואילך.

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

כברירת מחדל, פונקציות ענן עבור 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
  • 256MB
  • 512MB
  • 1GB
  • 2GB
  • 4GB
  • 8GB

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

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