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

تسرد هذه الصفحة الأخطاء التي قد تظهر لك من User Deletion API، وتشرح كيفية التعامل مع 500 خطأ وتنفيذ التراجع الأسي.

الردود المعيارية على الأخطاء

إذا كان طلب User Deletion API ناجحًا، تعرض واجهة برمجة التطبيقات رمز الحالة 200. في حال حدوث خطأ في أحد الطلبات، تعرض واجهة برمجة التطبيقات رمز حالة 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 يشير إلى أنّ طلب البحث غير صالح. على سبيل المثال، لم يكن معرّف العنصر الرئيسي متوفّرًا أو لم تكن مجموعة السمات أو المقاييس المطلوبة صالحة. لا تُعد المحاولة بدون حلّ المشكلة. عليك إجراء تغييرات على طلب البحث في واجهة برمجة التطبيقات لكي يعمل.
401 invalidCredentials يشير إلى أن الرمز المميز للمصادقة غير صالح أو منتهي الصلاحية. لا تُعد المحاولة بدون حلّ المشكلة. عليك الحصول على رمز مميّز جديد لمنح الأذونات.
403 insufficientPermissions يشير إلى أنّ المستخدم لا يملك الأذونات الكافية للكيان المحدّد في طلب البحث. لا تُعد المحاولة بدون حلّ المشكلة. يجب الحصول على أذونات كافية لتنفيذ العملية على العنصر المحدّد.
403 dailyLimitExceeded يشير إلى أن المستخدم قد تجاوز الحصة اليومية (إما لكل مشروع أو لكل ملف شخصي). لا تُعد المحاولة بدون حلّ المشكلة. لقد استهلكت حصتك اليومية. اطّلِع على حدود واجهة برمجة التطبيقات وحصصها.
403 userRateLimitExceeded يشير ذلك إلى تجاوز الحد الأقصى للطلبات كل 100 ثانية لكل مستخدم. القيمة التلقائية التي تم ضبطها في "وحدة تحكّم واجهة برمجة التطبيقات في Google" هي 100 طلب بحث كل 100 ثانية لكل مستخدم. يمكنك زيادة هذا الحدّ في وحدة تحكّم Google API إلى 1,000 كحدّ أقصى. أعِد المحاولة باستخدام التراجع الدليلي. عليك إبطاء معدّل إرسال الطلبات.
403 rateLimitExceeded يشير ذلك إلى تجاوز حدود معدل طلبات البحث في كل 100 ثانية للمشروع. أعِد المحاولة باستخدام التراجع الدليلي. عليك إبطاء معدّل إرسال الطلبات.
403 quotaExceeded يشير ذلك إلى أنّه تمّ الوصول إلى 10 طلبات متزامنة لكلّ عرض (ملفّ شخصي) في Core Reporting API. يُرجى إعادة المحاولة باستخدام خوارزمية الرقود الأسي الثنائي. عليك الانتظار حتى اكتمال طلب واحد على الأقلّ قيد التقدّم لهذا العرض (الملف الشخصي).
500 internalServerError حدث خطأ غير متوقَّع في الخادم الداخلي. لا تحاول إجراء هذا الاستعلام أكثر من مرة.
503 backendError عرَض الخادم خطأ. لا تحاول إجراء هذا الاستعلام أكثر من مرة.

التعامل مع الردود 500 أو 503

قد يحدث خطأ 500 أو 503 أثناء التحميل المكثّف أو عند تلقّي طلبات أكبر وأكثر تعقيدًا. بالنسبة إلى الطلبات الأكبر حجمًا، ننصحك بطلب البيانات لفترة زمنية أقصر. ننصحك أيضًا بتنفيذ خوارزمية الرقود الأسي. يمكن أن تعتمد تكرار هذه الأخطاء على طريقة العرض (الملف الشخصي) وكمية بيانات إعداد التقارير المرتبطة بهذه الطريقة. ولن يؤدي طلب البحث الذي يتسبب في خطأ 500 أو 503 لطريقة عرض (ملف شخصي) واحدة إلى حدوث خطأ بالضرورة لطلب البحث نفسه في طريقة عرض (ملف شخصي) مختلفة.

تنفيذ خوارزمية الرقود الأسي

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

في ما يلي كيفية تنفيذ خوارزمية الرقود الأسي الثنائي:

  1. أرسِل طلبًا إلى واجهة برمجة التطبيقات.
  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 هو عدد عشوائي من المللي ثانية أقل من أو يساوي 1000. هذا الإجراء ضروري لتجنُّب أخطاء القفل في بعض عمليات التنفيذ المتزامنة. يجب إعادة تحديد 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."