गड़बड़ियों के जवाब

स्टैंडर्ड गड़बड़ी रिस्पॉन्स

अगर Tag Manager API का अनुरोध स्वीकार कर लिया जाता है, तो एपीआई, रिस्पॉन्स के मुख्य हिस्से में, अनुरोध किए गए डेटा के साथ-साथ 200 एचटीटीपी स्टेटस कोड भी दिखाता है.

अगर किसी अनुरोध में कोई गड़बड़ी होती है, तो एपीआई, गड़बड़ी के टाइप के हिसाब से एचटीटीपी स्टेटस कोड और रिस्पॉन्स में वजह दिखाता है. इसके अलावा, जवाब के मुख्य हिस्से में गड़बड़ी की वजह के बारे में पूरी जानकारी होती है. यहां गड़बड़ी के जवाब का उदाहरण दिया गया है:

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."
 }
}

ध्यान दें: ब्यौरा किसी भी समय बदला जा सकता है. इसलिए, ऐप्लिकेशन को जानकारी के असल टेक्स्ट पर निर्भर नहीं करना चाहिए.

एक्सपोनेन्शियल बैकऑफ़ लागू करना

एक्सपोनेंशियल बैकऑफ़ एक ऐसी प्रोसेस है जिसमें कोई क्लाइंट, समय-समय पर फ़ेल हो चुके अनुरोध को बार-बार प्रोसेस करने की कोशिश करता है. यह नेटवर्क ऐप्लिकेशन के लिए, गड़बड़ियों को मैनेज करने की मानक रणनीति है. Tag Manager API को इस उम्मीद के हिसाब से डिज़ाइन किया गया है कि जो क्लाइंट, फ़ेल हो चुके अनुरोधों की फिर से कोशिश करने का विकल्प चुनते हैं वे ऐसा एक्सपोनेन्शियल बैकऑफ़ का इस्तेमाल करके करते हैं. एक्सपोनेन्शियल बैकऑफ़ का इस्तेमाल करने के साथ-साथ, "ज़रूरी" होने के अलावा, बैंडविथ के इस्तेमाल को बेहतर तरीके से किया जा सकता है. यह कामयाब रिस्पॉन्स पाने के लिए ज़रूरी अनुरोधों की संख्या कम करता है और एक साथ काम करने वाली जगहों पर अनुरोधों की संख्या बढ़ाता है.

सिंपल एक्स्पोनेंशियल बैकऑफ़ को लागू करने का फ़्लो नीचे दिया गया है.

  1. एपीआई से अनुरोध करें.
  2. गड़बड़ी का ऐसा जवाब पाएं जिसमें गड़बड़ी का ऐसा कोड हो जिसका दोबारा कोशिश की जा सकती हो.
  3. 1 सेकंड + random_number_milliseconds सेकंड इंतज़ार करें.
  4. फिर से अनुरोध करें.
  5. गड़बड़ी का ऐसा जवाब पाएं जिसमें गड़बड़ी का ऐसा कोड हो जिसका दोबारा कोशिश की जा सकती हो.
  6. दो सेकंड + random_number_milliseconds सेकंड इंतज़ार करें.
  7. फिर से अनुरोध करें.
  8. गड़बड़ी का ऐसा जवाब पाएं जिसमें गड़बड़ी का ऐसा कोड हो जिसका दोबारा कोशिश की जा सकती हो.
  9. चार सेकंड + random_number_milliseconds सेकंड इंतज़ार करें.
  10. फिर से अनुरोध करें.
  11. गड़बड़ी का ऐसा जवाब पाएं जिसमें गड़बड़ी का ऐसा कोड हो जिसका दोबारा कोशिश की जा सकती हो.
  12. आठ सेकंड + 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."