בדף הזה מפורטות השגיאות שעשויות להתקבל מ-User Deletion API, ומוסבר איך לטפל בשגיאות מסוג 500 ולהטמיע השהיה מעריכית לפני ניסיון חוזר.
תגובות סטנדרטיות לשגיאות
אם בקשת API למחיקת משתמשים תתבצע בהצלחה, ה-API יחזיר קוד סטטוס 200
.
אם מתרחשת שגיאה בבקשה, ה-API מחזיר בתגובה קוד סטטוס, סטטוס וסיבה של HTTP בהתאם לסוג השגיאה. בנוסף, גוף התשובה מכיל תיאור מפורט של מה שגרם לשגיאה. דוגמה לתשובת שגיאה:
{ "error": { "errors": [ { "domain": "global", "reason": "invalidParameter",
"message": "Invalid value '-1' for max-results. Value must be within the range:
[1, 1000]", "locationType": "parameter", "location": "max-results" } ], "code":
400, "message": "Invalid value '-1' for max-results. Value must be within the
range: [1, 1000]" } }
טבלת שגיאות
קוד | סיבה | תיאור | מה מומלץ לעשות? |
---|---|---|---|
400 | invalidParameter |
מציין שלפרמטר של הבקשה יש ערך לא חוקי. השדות locationType ו-location בתשובה לשגיאה מספקים מידע לגבי הערך שהיה לא תקין. |
אין לנסות שוב בלי לפתור את הבעיה. צריך לספק ערך תקין לפרמטר שצוין בתגובת השגיאה. |
400 | badRequest |
מציין שהשאילתה לא חוקית. לדוגמה, מזהה ההורה חסר או שהשילוב של המאפיינים או המדדים המבוקשים לא חוקי. | אין לנסות שוב בלי לפתור את הבעיה. כדי שהשאילתה ל-API תפעל, צריך לבצע בה שינויים. |
401 | invalidCredentials |
מציין שאסימון האימות לא תקין או שפג תוקפו. | אין לנסות שוב ללא תיקון הבעיה. צריך לקבל אסימון אימות חדש. |
403 | insufficientPermissions |
מציין שלמשתמש אין מספיק הרשאות לגבי הישות שצוינה בשאילתה. | אין לנסות שוב בלי לפתור את הבעיה. צריך לקבל הרשאות מספיקות כדי לבצע את הפעולה על הישות שצוינה. |
403 | dailyLimitExceeded |
מציין שהמשתמש חרג מהמכסה היומית (לכל פרויקט או לכל תצוגה (פרופיל)). | אין לנסות שוב בלי לפתור את הבעיה. ניצלת את המכסה היומית שלך. מגבלות ומכסות של API |
403 | userRateLimitExceeded |
הסטטוס הזה מציין חריגה מהמגבלה של שאילתות לכל 100 שניות לכל משתמש. ערך ברירת המחדל שמוגדר ב-Google API Console הוא 100 שאילתות לכל 100 שניות לכל משתמש. אפשר להגדיל את המגבלה הזו ב-מסוף Google API ל-1,000 לכל היותר. | אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). עליך להאט את קצב שליחת הבקשות. |
403 | rateLimitExceeded |
הסטטוס הזה מציין חריגה ממגבלות הקצב של שאילתות לכל 100 שניות בפרויקט. | אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). עליך להאט את קצב שליחת הבקשות. |
403 | quotaExceeded |
מציין שהגעתם ל-10 בקשות בו-זמנית לכל צפייה (פרופיל) ב-Core Reporting API. | אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). עליך להמתין לפחות בקשה אחת פעילה כדי שהתצוגה המפורטת הזו (הפרופיל) תושלם. |
500 | internalServerError |
אירעה שגיאה פנימית בלתי צפויה בשרת. | אין לנסות שוב את השאילתה הזו יותר מפעם אחת. |
503 | backendError |
השרת החזיר שגיאה. | אין לנסות שוב את השאילתה הזו יותר מפעם אחת. |
טיפול ב-500 או 503 תשובות
שגיאה מסוג 500
או 503
עשויה להתרחש במהלך עומס כבד או לבקשות גדולות ומורכבות יותר. בבקשות גדולות יותר, כדאי לבקש נתונים לתקופת זמן קצרה יותר. כדאי גם להטמיע השהיה מעריכית לפני ניסיון חוזר (exponential backoff). תדירות השגיאות האלה עשויה להיות תלויה בתצוגה (בפרופיל) ובכמות נתוני הדיווח המשויכים לתצוגה הזו. שאילתה שגורמת לשגיאה מסוג 500
או 503
בתצוגה (בפרופיל) אחת לא בהכרח תגרום לשגיאה באותה שאילתה עם תצוגה (פרופיל) אחרת.
הטמעת השהיה מעריכית לפני ניסיון חוזר (exponential backoff)
השהיה מעריכית לפני ניסיון חוזר (exponential backoff) היא התהליך שבו לקוח מנסה שוב ושוב לשלוח בקשה שנכשלה לאורך זמן שגדל. זוהי אסטרטגיה סטנדרטית לטיפול בשגיאות באפליקציות רשת. User Deletion API תוכנן מתוך הנחה שלקוחות שבוחרים לנסות שוב בקשות שנכשלו עושים זאת באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). בנוסף לכך שהיא 'חובה', השימוש בהשהיה מעריכית לפני ניסיון חוזר מגדיל את היעילות של השימוש ברוחב הפס, מפחית את מספר הבקשות הנדרשות כדי לקבל תשובה מוצלחת ומגדיל את תפוקת הבקשות בסביבות בו-זמניות.
כך מטמיעים השהיה מעריכית לפני ניסיון חוזר:
- שולחים בקשה ל-API.
- מתקבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב.
- צריך להמתין שנייה אחת +
random_number_milliseconds
שניות. - שולחים את הבקשה שוב.
- מתקבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב.
- ממתינים 2 שניות +
random_number_milliseconds
שניות. - שולחים את הבקשה שוב.
- מתקבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב.
- ממתינים 4 שניות +
random_number_milliseconds
שניות. - שולחים את הבקשה שוב.
- מתקבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב.
- ממתינים 8 שניות +
random_number_milliseconds
שניות. - שולחים את הבקשה שוב.
- מתקבלת תגובת שגיאה עם קוד שגיאה שניתן לנסות שוב.
- ממתינים 16 שניות +
random_number_milliseconds
שניות. - ניסיון חוזר לשלוח את הבקשה.
- אם עדיין מופיעה הודעת שגיאה, מפסיקים ורושמים את השגיאה.
בתהליך הקודם, random_number_milliseconds
הוא מספר אקראי של אלפיות שנייה שקטן מ-1,000 או שווה לו. הפעולה הזו נחוצה כדי למנוע שגיאות מסוימות של נעילת קבצים בהטמעות בו-זמניות מסוימות. צריך להגדיר מחדש את random_number_milliseconds
אחרי כל המתנה.
האלגוריתם מוגדר להסתיים כאשר 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."