این صفحه خطاهایی را که ممکن است از User Deletion API دریافت کنید فهرست میکند و نحوه مدیریت 500 خطا و پیادهسازی backoff نمایی را توضیح میدهد.
پاسخ های خطای استاندارد
اگر درخواست 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 | نشان می دهد که تعداد Queries در هر 100 ثانیه برای هر کاربر از حد مجاز فراتر رفته است. مقدار پیش فرض تنظیم شده در Google API Console 100 پرس و جو در هر 100 ثانیه برای هر کاربر است. می توانید این محدودیت را در Google API Console تا حداکثر 1000 افزایش دهید. | با استفاده از عقب نشینی نمایی دوباره امتحان کنید. باید سرعت ارسال درخواست ها را کاهش دهید. |
403 | rateLimitExceeded | نشان می دهد که درخواست های پروژه در هر 100 ثانیه از محدودیت های سرعت فراتر رفته است. | با استفاده از عقب نشینی نمایی دوباره امتحان کنید. باید سرعت ارسال درخواست ها را کاهش دهید. |
403 | quotaExceeded | نشان می دهد که به 10 درخواست همزمان برای هر نمایش (نمایه) در Core Reporting API رسیده است. | با استفاده از عقب نشینی نمایی دوباره امتحان کنید. برای تکمیل این نما (نمایه) باید منتظر حداقل یک درخواست در حال انجام باشید. |
500 | internalServerError | خطای سرور داخلی غیرمنتظره رخ داد. | این پرس و جو را بیش از یک بار تکرار نکنید. |
503 | backendError | سرور یک خطا برگرداند. | این پرس و جو را بیش از یک بار تکرار نکنید. |
رسیدگی به 500 یا 503 پاسخ
خطای 500
یا 503
ممکن است در هنگام بارگذاری سنگین یا برای درخواست های پیچیده تر بزرگتر ایجاد شود. برای درخواست های بزرگتر، درخواست داده برای مدت زمان کوتاه تری را در نظر بگیرید. همچنین پیاده سازی عقب نشینی نمایی را در نظر بگیرید. فراوانی این خطاها می تواند به نما (نمایه) و میزان گزارش داده های مرتبط با آن نمای بستگی داشته باشد. پرس و جوی که باعث ایجاد خطای 500
یا 503
برای یک نمای (نمایه) می شود، لزوماً برای همان پرس و جو با نمای متفاوت (نمایه) خطا ایجاد نمی کند.
پیاده سازی عقب نشینی نمایی
عقب نشینی نمایی فرآیندی است که در آن مشتری به طور دوره ای یک درخواست ناموفق را در مدت زمان فزاینده ای امتحان می کند. این یک استراتژی مدیریت خطای استاندارد برای برنامه های کاربردی شبکه است. User Deletion API با این انتظار طراحی شده است که مشتریانی که درخواستهای ناموفق را مجدداً امتحان میکنند، این کار را با استفاده از backoff نمایی انجام دهند. علاوه بر "ضروری" بودن، استفاده از پسانداز نمایی، کارایی استفاده از پهنای باند را افزایش میدهد، تعداد درخواستهای مورد نیاز برای دریافت پاسخ موفق را کاهش میدهد و توان عملیاتی درخواستها را در محیطهای همزمان به حداکثر میرساند.
در اینجا نحوه پیاده سازی عقب نشینی نمایی آمده است:
- یک درخواست به API بدهید.
- پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است.
- 1 ثانیه +
random_number_milliseconds
ثانیه صبر کنید. - درخواست مجدد.
- پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است.
- 2 ثانیه +
random_number_milliseconds
ثانیه صبر کنید. - درخواست مجدد.
- پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است.
- 4 ثانیه +
random_number_milliseconds
ثانیه صبر کنید. - درخواست مجدد.
- پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است.
- 8 ثانیه +
random_number_milliseconds
ثانیه صبر کنید. - درخواست مجدد.
- پاسخ خطایی را دریافت کنید که دارای کد خطای قابل امتحان مجدد است.
- 16 ثانیه +
random_number_milliseconds
ثانیه صبر کنید. - درخواست مجدد.
- اگر باز هم با خطا مواجه شدید، توقف کرده و خطا را ثبت کنید.
در جریان قبلی، random_number_milliseconds
تعداد تصادفی میلی ثانیه کمتر یا مساوی 1000 است. این برای جلوگیری از خطاهای قفل خاص در برخی از پیاده سازی های همزمان ضروری است. random_number_milliseconds
باید بعد از هر انتظار دوباره تعریف شود.
الگوریتم تنظیم شده است تا زمانی که n 5 باشد خاتمه یابد. این سقف فقط برای جلوگیری از تلاش مجدد مشتریان برای بی نهایت وجود دارد و منجر به تأخیر کلی حدود 32 ثانیه قبل از تلقی درخواست "خطای غیرقابل جبران" می شود.
کد پایتون زیر پیاده سازی جریان قبلی برای بازیابی خطاهایی است که در روشی به نام 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."