الردود على الخطأ

استجابات الأخطاء العادية

إذا نجح طلب البيانات من واجهة برمجة التطبيقات في "إدارة العلامات من Google"، ستعرض واجهة برمجة التطبيقات رمز حالة HTTP 200 مع البيانات المطلوبة في نص الاستجابة.

في حال حدوث خطأ في أحد الطلبات، تعرض واجهة برمجة التطبيقات رمز حالة 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."
 }
}

ملاحظة: يمكن أن يتغيّر الوصف في أي وقت، وبالتالي يجب ألا تعتمد التطبيقات على نص الوصف الفعلي.

تنفيذ التراجع الأسي

التراجع التزايدي هو عملية يُعيد فيها العميل محاولة إجراء طلب غير ناجح بشكل دوري على مدار فترة زمنية متزايدة. وهي استراتيجية عادية لمعالجة الأخطاء لتطبيقات الشبكة. تم تصميم واجهة برمجة التطبيقات الخاصة بـ "إدارة العلامات من Google" على نحو يتوقّع من العملاء الذين يعيدون محاولة إجراء الطلبات غير الناجحة، وذلك باستخدام ميزة "التراجع الأُسيّ". بالإضافة إلى كونها "مطلوبة"، يؤدي استخدام ميزة "التراجع الأسي" إلى زيادة فعالية استخدام معدل نقل البيانات، وتقليل عدد الطلبات المطلوبة للحصول على استجابة ناجحة، وزيادة سرعة معالجة الطلبات في البيئات المتزامنة.

في ما يلي خطوات تنفيذ تراجع أسي بسيط.

  1. يمكنك تقديم طلب إلى واجهة برمجة التطبيقات.
  2. تلقّي استجابة خطأ تتضمّن رمز خطأ يمكن إعادة المحاولة.
  3. الانتظار لمدة ثانية واحدة + random_number_milliseconds ثانية
  4. إعادة محاولة الطلب.
  5. تلقّي استجابة خطأ تتضمّن رمز خطأ يمكن إعادة المحاولة.
  6. الانتظار لمدة ثانيتين + 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(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."