תגובות לשגיאות

תגובות רגילות לשגיאות

אם הבקשה של Reporting API תאושר, ה-API יחזיר 200. במקרה ששגיאה מתרחשת בבקשה, ה-API מחזיר בתגובה קוד סטטוס, סטטוס וסיבה של HTTP, בהתאם לסוג השגיאה. בנוסף, גוף התשובה מכיל תיאור מפורט של הגורם לשגיאה. דוגמה לתגובת שגיאה:

{
 "error": {
  "code": 403,
  "message": "User does not have sufficient permissions for this profile.",
  "status": "PERMISSION_DENIED"
 }
}

טבלת שגיאות

קוד סטטוס תיאור מה מומלץ לעשות?
400 INVALID_ARGUMENT הבקשה לא חוקית. ייתכן שארגומנט חובה חסר, חורג מהמגבלות או שיש לו ערך לא חוקי. אפשר לקרוא פרטים נוספים בהודעת השגיאה. השגיאה תיכשל שוב אם הלקוח ינסה להציג אותה שוב.
401 UNAUTHENTICATED הלקוח לא אומת כראוי. אין לנסות שוב ללא תיקון הבעיה. עליך לקבל אסימון אימות חדש.
403 PERMISSION_DENIED מציין את הבקשה לקבלת נתונים שלמשתמש אין גישה אליהם. אין לנסות שוב ללא תיקון הבעיה. יש צורך בהרשאות מספיקות כדי לבצע את הפעולה בישות שצוינה.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d מציין שהמכסה של הבקשות ליום לכל פרויקט מוצתה. אין לנסות שוב ללא תיקון הבעיה. ניצלת את כל המכסה היומית.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s מציין שמיצית את המכסה של בקשות ל-100 שניות בפרויקט. אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). יש להאט את קצב שליחת הבקשות.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100s מציין שמיצית את המכסה של בקשות ל-100 שניות לכל משתמש בפרויקט. אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). יש להאט את קצב שליחת הבקשות.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100s סימן שמכסת בקשות ל-100 שניות מוצתה. תגובת הגילוי לא משתנה לעיתים קרובות. יש לשמור את תגובת הגילוי במטמון באופן מקומי או לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). צריך להאט את קצב שליחת הבקשות.
500 INTERNAL אירעה שגיאת שרת פנימית לא צפויה. אין לנסות שוב לבצע את השאילתה הזו יותר מפעם אחת.
503 BACKEND_ERROR השרת החזיר שגיאה. אין לנסות שוב לבצע את השאילתה הזו יותר מפעם אחת.
503 UNAVAILABLE השירות לא הצליח לעבד את הבקשה. סביר להניח שזה מצב זמני ואפשר לתקן אותו על ידי ניסיון חוזר עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff).

הטמעת השהיה מעריכית לפני ניסיון חוזר (exponential backoff)

השהיה מעריכית לפני ניסיון חוזר (exponential backoff) הוא התהליך של לקוח שמנסה מדי פעם לשלוח בקשה שנכשלה למשך פרק זמן הולך וגדל. זוהי אסטרטגיה סטנדרטית לטיפול בשגיאות באפליקציות רשת. ה-Reporting API מתוכנן כך ללקוחות שיבחרו לנסות שוב בקשות שנכשלו לעשות זאת באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). מעבר ל'חובה', השימוש בהשהיה מעריכית לפני ניסיון חוזר (exponential backoff) מגביר את היעילות של השימוש ברוחב הפס, מצמצם את מספר הבקשות הנדרשות כדי לקבל תגובה מוצלחת ומגדיל את תפוקת הבקשות בסביבות בו-זמניות.

התהליך להטמעת השהיה מעריכית פשוטה לפני ניסיון חוזר הוא:

  1. שליחת בקשה ל-API
  2. קבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב
  3. צריך להמתין שנייה אחת + random_number_milliseconds שניות
  4. ניסיון חוזר של הבקשה
  5. קבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב
  6. המתנה של 2 שניות + random_number_milliseconds שניות
  7. ניסיון חוזר של הבקשה
  8. קבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב
  9. המתנה של 4 שניות + random_number_milliseconds שניות
  10. ניסיון חוזר של הבקשה
  11. קבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב
  12. המתנה של 8 שניות + random_number_milliseconds שניות
  13. ניסיון חוזר של הבקשה
  14. קבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב
  15. המתנה של 16 שניות + random_number_milliseconds שניות
  16. ניסיון חוזר של הבקשה
  17. אם עדיין מופיעה הודעת שגיאה, עוצרים ורושמים את השגיאה.

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

הערה: ההמתנה היא תמיד (2 ^ n) + random_number_milliseconds, כאשר n הוא מספר שלם מונוטוני שמוגדר בהתחלה כ-0. n מחושב ב-1 בכל איטרציה (כל בקשה).

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

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

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(analytics):
  """Wrapper to request Google Analytics data with exponential backoff.

  The makeRequest method accepts the analytics service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    analytics: The analytics service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(analytics)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded',
                               'internalServerError', 'backendError']:
        time.sleep((2 ** n) + random.random())
      else:
        break

  print "There has been an error, the request never succeeded."