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

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

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

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

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

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

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

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

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

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

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

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

הגדר ניסיונות חוזרים ממסוף GCP

אם אתה יוצר פונקציה חדשה:

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

אם אתה מעדכן פונקציה קיימת:

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

הגדר ניסיונות חוזרים מקוד הפונקציה שלך

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

הגדר את מדיניות הניסיון החוזר

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

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

כדי להגדיר את מדיניות הניסיון החוזר:

  1. כתוב פונקציית HTTP.
  2. השתמש ב-Pub/Sub API כדי ליצור מנוי Pub/Sub, תוך ציון כתובת האתר של הפונקציה כיעד.

ראה תיעוד Pub/Sub על טיפול בכשלים למידע נוסף על הגדרת Pub/Sub ישירות.