במאמר הזה מוסבר איך להגדיר ניסיונות חוזרים לפונקציות Cloud Run מבוססות-אירועים.
כפי שמתואר במאמר ניסיון חוזר של אירועים, אם יעד של הודעת Pub/Sub לא יכול לאשר את קבלת ההודעה, תגובת ברירת המחדל של Pub/Sub היא לשלוח את ההודעה שוב עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff). השהיה מעריכית לפני ניסיון חוזר (exponential backoff) מאפשרת להוסיף עיכובים ארוכים יותר ויותר בין ניסיונות חוזרים. אבל יכול להיות שזה לא ההתנהגות שאתם רוצים בהטמעה הספציפית שלכם.
המאפיין retries לא מיושם בפונקציה עצמה, אלא בגורם המפעיל Eventarc שמפעיל את הפונקציה, מה שמאפשר גמישות רבה יותר. המשמעות היא שביעדים של Cloud Run (כולל פונקציות Cloud Run שנוצרו באמצעות Cloud Run Admin API או Cloud Functions v2 API), אפשר להגדיר ניסיון מסירה יחיד ללא ניסיונות חוזרים. זוהי הגדרת ברירת המחדל כשיוצרים טריגר Eventarc במסוף Google Cloud מהדף Cloud Run. מידע נוסף זמין במאמר בנושא יצירת טריגרים באמצעות Eventarc.
למה פונקציות מבוססות-אירועים לא מצליחות להסתיים
יכול להיות שפונקציה מבוססת-אירועים לא תושלם בהצלחה בגלל שגיאות שמוחזרות בקוד הפונקציה עצמו. הסיבות לכך יכולות להיות:
- הפונקציה מכילה באג וזמן הריצה יוצר חריגה.
- הפונקציה לא יכולה להגיע לנקודת קצה של שירות, או שהזמן הקצוב לתפוגה שלה מסתיים בזמן הניסיון לעשות זאת.
- הפונקציה יוצרת בכוונה חריגה (לדוגמה, כשפרמטר לא עובר אימות).
- פונקציית Node.js מחזירה הבטחה שנדחתה, או מעבירה ערך שאינו
nullלפונקציית קריאה חוזרת. - במקרים נדירים, יכול להיות שפונקציה תצא לפני הזמן בגלל שגיאה פנימית, וכברירת מחדל, יכול להיות שהמערכת תנסה להפעיל אותה מחדש באופן אוטומטי או שלא.
בכל אחד מהמקרים האלה, הפונקציה תפסיק לפעול ותחזיר שגיאה. לגורמים להפעלת אירועים שיוצרים את ההודעות יש מדיניות ניסיון חוזר שאפשר להתאים אישית כדי לענות על הצרכים של הפונקציה.
הגדרת מדיניות הניסיון החוזר
בהתאם לצרכים של פונקציית Cloud Run, יכול להיות שתרצו להגדיר את מדיניות הניסיון החוזר באמצעות מדיניות הניסיון החוזר של מינוי Pub/Sub שמשויכת לטריגר Eventarc. כך תוכלו להגדיר כל שילוב של האפשרויות הבאות:
- לקצר את חלון הניסיון החוזר מ-7 ימים ל-10 דקות בלבד.
- משנים את זמן ההשהיה המינימלי והמקסימלי באסטרטגיית הניסיון החוזר עם השהיה אקספוננציאלית.
- משנים את אסטרטגיית הניסיון החוזר לניסיון חוזר מיידי.
- מגדירים נושא להודעות ללא מוצא.
- הגדרת מספר מקסימלי ומינימלי של ניסיונות מסירה.
כדי להגדיר את מדיניות הניסיון החוזר:
- כתיבת פונקציית HTTP.
- משתמשים ב-Pub/Sub API כדי ליצור מינוי ל-Pub/Sub, ומציינים את כתובת ה-URL של הפונקציה כיעד.
במסמכי התיעוד של Eventarc בנושא ניסיון חוזר של אירועים מופיעות המלצות נוספות, כמו יצירת פונקציות מבוססות-אירועים שניתן לנסות שוב להפעיל אותן (אידמפוטנטיות).
במסמכי התיעוד של Pub/Sub בנושא טיפול בכשלים מופיע מידע נוסף על הגדרה ישירה של Pub/Sub.
שיטות מומלצות
בקטע הזה מתוארות שיטות מומלצות לשימוש בניסיונות חוזרים.
שימוש בניסיון חוזר לתיקון שגיאות חולפות
מכיוון שהפונקציה מנסה לפעול שוב ושוב עד שהיא מצליחה, צריך לבצע בדיקות כדי לוודא שאין בקוד שגיאות קבועות כמו באגים, לפני שמפעילים ניסיונות חוזרים. השימוש בנסיונות חוזרים מומלץ לטיפול בכשלים לסירוגין או זמניים, שיש סיכוי גבוה שייפתרו בניסיון חוזר, כמו נקודת קצה של שירות לא יציב או פסק זמן.
הגדרת תנאי סיום כדי למנוע לולאות אינסופיות של ניסיונות חוזרים
מומלץ להגן על הפונקציה מפני לולאות חוזרות בלתי פוסקות כשמשתמשים בניסיונות חוזרים. כדי לעשות את זה, צריך להוסיף תנאי סיום מוגדר היטב לפני שהפונקציה מתחילה לעבד. שימו לב שהטכניקה הזו פועלת רק אם הפונקציה מתחילה לפעול בהצלחה ויכולה להעריך את תנאי הסיום.
גישה יעילה היא להשליך אירועים עם חותמות זמן ישנות יותר מזמן מסוים. כך אפשר למנוע ביצועים מוגזמים אם הכשלים נמשכים או ארוכים מהצפוי.
לדוגמה, קטע הקוד הזה מבטל את כל האירועים שהתרחשו לפני יותר מ-10 שניות:
Node.js
Python
Go
Java
C#
Ruby
PHP
הבחנה בין פונקציות שאפשר לנסות שוב לבין שגיאות קריטיות
אם הפעלתם ניסיונות חוזרים בפונקציה, כל שגיאה שלא טופלה תפעיל ניסיון חוזר. מוודאים שהקוד מתעד שגיאות שלא אמורות להוביל לניסיון חוזר.
Node.js
Python
Go
Java
C#
Ruby
PHP
השלבים הבאים
- פריסת פונקציה ב-Cloud Run
- יצירת טריגרים מאירועים של Pub/Sub
- יצירת טריגרים מאירועים ב-Cloud Storage
- הפעלת פונקציות מ-Pub/Sub באמצעות Eventarc
- הפעלת פונקציות מ-Cloud Storage באמצעות Eventarc