پاسخ های خطا

پاسخ های خطای استاندارد

اگر یک درخواست API Tag Manager موفقیت آمیز باشد، API یک کد وضعیت HTTP 200 را به همراه داده های درخواستی در بدنه پاسخ برمی گرداند.

اگر در یک درخواست خطایی رخ دهد، API یک کد وضعیت HTTP و دلیل را بر اساس نوع خطا در پاسخ برمی‌گرداند. علاوه بر این، بدنه پاسخ حاوی شرح مفصلی از آنچه باعث خطا شده است. در اینجا نمونه ای از پاسخ به خطا آورده شده است:

400 invalidParameter

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "accessNotConfigured",
    "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
   }
  ],
  "code": 403,
  "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project."
 }
}

توجه : توضیحات ممکن است در هر زمان تغییر کند، بنابراین برنامه ها نباید به متن توضیحات واقعی بستگی داشته باشند.

پیاده سازی عقب نشینی نمایی

عقب نشینی نمایی فرآیندی است که در آن مشتری به طور دوره ای یک درخواست ناموفق را در مدت زمان فزاینده ای امتحان می کند. این یک استراتژی مدیریت خطای استاندارد برای برنامه های کاربردی شبکه است. API Tag Manager با این انتظار طراحی شده است که مشتریانی که درخواست‌های ناموفق را مجدداً امتحان می‌کنند، این کار را با استفاده از عقب‌نشینی نمایی انجام دهند. علاوه بر "ضروری" بودن، استفاده از پس‌انداز نمایی، کارایی استفاده از پهنای باند را افزایش می‌دهد، تعداد درخواست‌های مورد نیاز برای دریافت پاسخ موفق را کاهش می‌دهد و توان عملیاتی درخواست‌ها را در محیط‌های همزمان به حداکثر می‌رساند.

جریان برای اجرای پس‌انداز نمایی ساده به شرح زیر است.

  1. یک درخواست به API بدهید.
  2. پاسخ خطایی را دریافت کنید که دارای کد خطایی است که می توان آن را دوباره امتحان کرد.
  3. 1 ثانیه + random_number_milliseconds ثانیه صبر کنید.
  4. درخواست مجدد.
  5. پاسخ خطایی را دریافت کنید که دارای کد خطایی است که می توان آن را دوباره امتحان کرد.
  6. 2 ثانیه + random_number_milliseconds ثانیه صبر کنید.
  7. درخواست مجدد.
  8. پاسخ خطایی را دریافت کنید که دارای کد خطایی است که می توان آن را دوباره امتحان کرد.
  9. 4 ثانیه + random_number_milliseconds ثانیه صبر کنید.
  10. درخواست مجدد.
  11. پاسخ خطایی را دریافت کنید که دارای کد خطایی است که می توان آن را دوباره امتحان کرد.
  12. ۸ ثانیه + random_number_milliseconds ثانیه صبر کنید.
  13. درخواست مجدد.
  14. پاسخ خطایی را دریافت کنید که دارای کد خطایی است که می توان آن را دوباره امتحان کرد.
  15. 16 ثانیه + random_number_milliseconds ثانیه صبر کنید.
  16. درخواست مجدد.
  17. اگر باز هم با خطا مواجه شدید، توقف کرده و خطا را ثبت کنید.

در جریان فوق، random_number_milliseconds تعداد تصادفی میلی ثانیه کمتر یا مساوی 1000 است. این برای جلوگیری از خطاهای قفل خاص در برخی از پیاده سازی های همزمان ضروری است. random_number_milliseconds باید بعد از هر انتظار دوباره تعریف شود.

توجه : انتظار همیشه (2 ^ n ) + random_number_milliseconds است، که در آن n یک عدد صحیح افزایش دهنده یکنواخت است که ابتدا به صورت 0 تعریف شده است. متغیر n برای هر تکرار (هر درخواست) 1 افزایش می یابد.

این الگوریتم تنظیم شده است تا زمانی که n 5 باشد خاتمه یابد. این سقف فقط برای جلوگیری از تلاش مجدد مشتریان برای بی نهایت وجود دارد و منجر به تأخیر کلی حدود 32 ثانیه قبل از تلقی درخواست "خطای غیرقابل جبران" می شود.

کد پایتون زیر پیاده سازی جریان فوق برای بازیابی خطاهایی است که در روشی به نام makeRequest رخ می دهد.

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(tagmanager):
  """Wrapper to request Google Tag Manager data with exponential backoff.

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

  Args:
    tagmanager: The tagmanager service object

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

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

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