Catch up on everthing we announced at this year's Firebase Summit. Learn more

טיפים וטריקים

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

נְכוֹנוּת

פרק זה מתאר שיטות עבודה מומלצות כלליות לתכנון ויישום פונקציות ענן.

כתוב פונקציות idempotent

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

אל תתחיל בפעילויות רקע

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

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

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

מחק תמיד קבצים זמניים

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

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

אל תנסה לכתוב מחוץ לספרייה הזמנית, והקפד להשתמש בשיטות בלתי תלויות בפלטפורמה/מערכת הפעלה לבניית נתיבי קבצים.

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

כלים

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

פיתוח מקומי

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

מפתחי Firebase יכול להשתמש פונקציות ענן CLI Firebase Emulator .

השתמש ב- Sendgrid כדי לשלוח מיילים

Cloud Functions אינו מאפשר חיבורים יוצאים ביציאה 25, כך שלא תוכל ליצור חיבורים לא מאובטחים לשרת SMTP. הדרך המומלצת לשלוח מיילים היא להשתמש SendGrid . ניתן למצוא אפשרויות אחרות עבור שליחת דואר אלקטרוני דוא"ל השליחה ממופע של הדרכה עבור Google Compute Engine.

ביצועים

חלק זה מתאר שיטות עבודה מומלצות לאופטימיזציה של הביצועים.

השתמש בתלות בחוכמה

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

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

השתמש במשתנים גלובליים לשימוש חוזר באובייקטים בהזמנות עתידיות

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

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

console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});

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

עשו אתחול עצלן של משתנים גלובליים

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

const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});

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

הפחת את ההתחלות הקרות על ידי הגדרת מספר מופעים מינימלי

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

ראה התנהגות קנה המידה בקרה לקבלת מידע נוסף על אפשרויות ריצה הללו.

משאבים נוספים

למידע נוסף על אופטימיזציה של ביצועים ב "Google Cloud ביצועי האטלס" וידאו פונקציות ענן קר זמן אתחול .