בדף הזה מופיע תיאור של שיטות מומלצות לניסיון חוזר של בקשות שנכשלו ל-API של הגנה מוגברת על המודל.
לבקשות שאפשר לבצע להן ניסיון חוזר בבטחה, מומלץ להשתמש בהשהיה מעריכית קטועה לפני ניסיון חוזר (truncated exponential backoff) עם תוספת של רעידות.
סקירה כללית של השהיה מעריכית קטועה לפני ניסיון חוזר (truncated exponential backoff)
כל בקשה ל-API של הגנה מוגברת על המודל יכולה להצליח או להיכשל. אם האפליקציה תנסה לשלוח שוב בקשות שנכשלו בלי לחכות, היא עלולה לשלוח להגנה מוגברת על המודל מספר רב של בקשות חוזרות בפרק זמן קצר. כתוצאה מכך, תיתכן חריגה מהמכסות והמגבלות שחלות על כל משאב הגנה מוגברת על המודל בפרויקט Google Cloud .
כדי למנוע את הבעיה, מומלץ מאוד להשתמש בהשהיה מעריכית קטועה לפני ניסיון חוזר עם תוספת של רעידות, שהיא אסטרטגיה סטנדרטית לטיפול בשגיאות באפליקציות רשת. בגישה הזו, לקוח מנסה שוב ושוב לשלוח בקשה שנכשלה, עם עלייה מעריכית בהשהייה בין הניסיונות החוזרים. בנוסף מתבצעת הוספה של השהייה אקראית קטנה, שמכונה רעידות, בין הניסיונות. השהייה האקראית הזו עוזרת למנוע גל מסונכרן של ניסיונות חוזרים ממספר לקוחות, שמכונה גם בעיית העדר הרועם.
אלגוריתם של השהיה מעריכית לפני ניסיון חוזר (exponential backoff)
האלגוריתם הבא מיישם השהיה מעריכית קטועה לפני ניסיון חוזר (truncated exponential backoff) עם רעידות:
- שליחת בקשה ל-Model Armor.
-
אם הבקשה נכשלת, צריך להמתין 1 +
random-fraction שניות, ולאחר מכן לנסות שוב את הבקשה. -
אם הבקשה נכשלת, צריך להמתין 2 +
random-fraction שניות, ולאחר מכן לנסות שוב את הבקשה. -
אם הבקשה נכשלת, צריך להמתין 4 +
random-fraction שניות, ולאחר מכן לנסות שוב את הבקשה. -
צריך להמשיך בדפוס הזה ולהמתין 2n +
random-fraction שניות אחרי כל ניסיון חוזר, עד זמן שלmaximum-backoff. -
אחרי
deadlineשניות צריך להפסיק לנסות מחדש את הבקשה.
במימוש האלגוריתם, צריך להשתמש בערכים הבאים:
-
לפני כל ניסיון חוזר, זמן ההמתנה הוא
min((2n + random-fraction), maximum-backoff), שבוnמתחיל ב-0 וגדל ב-1 בכל ניסיון חוזר. -
מחליפים את
random-fractionבערך עשרוני אקראי שקטן מ-1 או שווה לו. צריך להשתמש בערך שונה בכל ניסיון חוזר. הוספת ערך אקראי הזה מונעת סנכרון של לקוחות ושליחה של מספר גדול של ניסיונות חוזרים בו-זמנית. -
מחליפים את
maximum-backoffבמספר השניות המקסימלי שצריך להמתין בין הניסיונות החוזרים. הערכים האופייניים הם 32 או 64 (25 או 26) שניות. צריך לבחור את הערך המתאים ביותר לתרחיש לדוגמה שלכם. -
מחליפים את
deadlineבמספר השניות המקסימלי לשליחת ניסיונות חוזרים. צריך לבחור ערך שמשקף את התרחיש לדוגמה שלכם. לדוגמה, בצינור עיבוד נתונים של CI/CD לאינטגרציה/פריסה רציפה שלא רגיש מאוד לזמן, כדאי להגדיר אתdeadlineל-300 שניות (5 דקות).
סוגי שגיאות לניסיונות חוזרים
יש להשתמש באסטרטגיה הזו של ניסיונות חוזרים לכל הבקשות ל-API של הגנה מוגברת על המודל שמחזירות את קודי השגיאות 500, 502, 503 או 504.
אפשר גם להשתמש באסטרטגיה הזו לניסיונות חוזרים לבקשות ל-API של הגנה מוגברת על המודל שמחזירות את קוד השגיאה 429.