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

गड़बड़ी के स्टैंडर्ड जवाब

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

{
 "error": {
  "code": 403,
  "message": "User does not have sufficient permissions for this profile.",
  "status": "PERMISSION_DENIED"
 }
}

गड़बड़ी की टेबल

कोड स्थिति जानकारी सुझाई गई कार्रवाई
400 INVALID_ARGUMENT अनुरोध अमान्य है; हो सकता है कि एक ज़रूरी तर्क मौजूद न हो, सीमा से ज़्यादा हो या उसका मान गलत हो. ज़्यादा जानकारी के लिए गड़बड़ी के मैसेज की समीक्षा करें. अगर क्लाइंट बार-बार कोशिश करता है, तो यह गड़बड़ी फिर से लोड नहीं होगी.
401 UNAUTHENTICATED क्लाइंट की पुष्टि ठीक से नहीं हुई है. समस्या को ठीक किए बिना फिर से कोशिश न करें. आपको नया पुष्टि करने वाला टोकन लेना होगा.
403 PERMISSION_DENIED यह ऐसे डेटा के अनुरोध को दिखाता है जिसका उपयोगकर्ता के पास ऐक्सेस नहीं है. समस्या को ठीक किए बिना फिर से कोशिश न करें. बताई गई इकाई पर कार्रवाई करने के लिए, आपके पास ज़रूरी अनुमतियां होनी चाहिए.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d इससे पता चलता है कि हर प्रोजेक्ट के लिए अनुरोध कोटा करने की समयसीमा खत्म हो गई है. समस्या को ठीक किए बिना फिर से कोशिश न करें. आपने अपना दैनिक कोटा पूरा कर लिया है.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s इससे पता चलता है कि हर प्रोजेक्ट के लिए हर 100 सेकंड के अनुरोध की समयसीमा खत्म हो गई है. एक्स्पोनेंशियल बैक-ऑफ़ का इस्तेमाल करके फिर से कोशिश करें. आपको उस दर को धीमा करना होगा जिस पर आप अनुरोध भेज रहे हैं.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100 इससे पता चलता है कि हर प्रोजेक्ट के लिए हर उपयोगकर्ता के हिसाब से बनाए गए हर 100 सेकंड के अनुरोध की समयसीमा खत्म हो गई है. एक्स्पोनेंशियल बैक-ऑफ़ का इस्तेमाल करके फिर से कोशिश करें. आपको उस दर को धीमा करना होगा जिस पर आप अनुरोध भेज रहे हैं.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100s इससे पता चलता है कि हर 100 सेकंड में किए गए अनुरोधों की समयसीमा खत्म हो गई है. डिस्कवरी रिस्पॉन्स अक्सर नहीं बदलता है; डिस्कवरी रिस्पॉन्स को स्थानीय तौर पर कैश मेमोरी में सेव करें या एक्स्पोनेंशियल बैक-ऑफ़ का इस्तेमाल करके फिर से कोशिश करें. आपको उस दर को धीमा करना होगा जिस पर आप अनुरोध भेज रहे हैं.
500 INTERNAL सर्वर में अचानक कोई गड़बड़ी हुई. इस क्वेरी को एक से ज़्यादा बार फिर से कोशिश न करें.
503 BACKEND_ERROR सर्वर ने एक गड़बड़ी दी. इस क्वेरी को एक से ज़्यादा बार फिर से कोशिश न करें.
503 UNAVAILABLE सेवा अनुरोध को संसाधित नहीं कर सकी. ऐसा होना थोड़े समय के लिए होता है. एक्स्पोनेंशियल बैक-ऑफ़ की कोशिश करके, इसे ठीक किया जा सकता है.

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

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

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

  1. एपीआई को अनुरोध भेजने का तरीका
  2. गड़बड़ी का ऐसा रिस्पॉन्स पाएं जिसमें फिर से कोशिश करने लायक गड़बड़ी कोड हो
  3. 1 सेकंड + 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 बिना किसी क्रम में लगी संख्या में 1000 से कम या उसके बराबर होती है. ऐसा इसलिए किया जाता है, ताकि एक साथ लागू करने के कुछ मामलों में लॉक की गड़बड़ियों से बचा जा सके. हर इंतज़ार के बाद 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(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."