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

נסה שוב פונקציות אסינכרוניות

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

סמנטיקה של ניסיון חוזר

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

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

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

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

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

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

הפעלה והשבתה של נסיונות חוזרים

שימוש במסוף GCP

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

  1. עבור אל דף סקירת פונקציות ענן במסוף בפלטפורמת הענן.

  2. לחץ על צור פונקציה. לחלופין, לחץ פונקציה קיימת כדי לעבור לדף הפרטים שלו ולחץ על עריכה.

  3. מלא את השדות הדרושים עבור הפונקציה שלך.

  4. ודא בתחום טריגר מוגדר סוג הדק מבוסס אירוע, כגון ענן Pub / Sub או לאחסון בענן.

  5. להרחיב את ההגדרות המתקדמות בלחיצה על עוד.

  6. סמן או בטל את סימון התיבה נסה שנית על כישלון.

בקוד פונקציה

עם פונקציות ענן עבור Firebase, תוכל להפעיל ניסיונות חוזרים בקוד עבור פונקציה. כדי לעשות זאת עבור פונקציה רקע כגון functions.foo.onBar(myHandler); , להשתמש runWith ולהגדיר מדיניות כישלון:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

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

שיטות עבודה מומלצות

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

השתמש בניסיון חוזר כדי לטפל בשגיאות חולפות

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

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

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

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

לדוגמה, קטע קוד זה מבטל את כל האירועים בני יותר מ -10 שניות:

const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
  console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
  callback();
  return;
}

השתמש catch בהבטחות

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

להלן דוגמא למה שעליך לעשות:

return doFooAsync().catch((err) => {
    if (isFatal(err)) {
        console.error(`Fatal error ${err}`);
    }
    return Promise.reject(err);
});

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

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

  • ממשקי API חיצוניים רבים (כגון Stripe) מאפשרים לך לספק מפתח idempotency כפרמטר. אם אתה משתמש בממשק API כזה, עליך להשתמש במזהה האירוע כמפתח idempotency.
  • Idempotency פועל היטב עם משלוח לפחות פעם אחת, מכיוון שהוא הופך אותו בטוח לנסות שוב. אז שיטה מומלצת כללית לכתיבת קוד אמין היא שילוב של חוסר יכולת עם ניסיונות חוזרים.
  • וודא שהקוד שלך חסר פוטנציאל פנימי. לדוגמה:
    • ודא שמוטציות יכולות לקרות יותר מפעם אחת מבלי לשנות את התוצאה.
    • מצב מסד הנתונים של שאילתה בעסקה לפני השתקת המדינה.
    • וודא שכל תופעות הלוואי עצמן חסרות משמעות.
  • הטיל צ'ק עסקי מחוץ לפונקציה, ללא תלות בקוד. לדוגמה, המשך לקבוע במקום כלשהו להקליט שמזהה אירוע נתון כבר עבר עיבוד.
  • להתמודד עם שיחות פונקציות כפולות מחוץ להקה. לדוגמה, יש לבצע תהליך ניקוי נפרד המתנקה לאחר שיחות פונקציונליות כפולות.