गड़बड़ी के स्टैंडर्ड जवाब
अगर मुख्य रिपोर्टिंग एपीआई के लिए अनुरोध किया जाता है, तो एपीआई 200
स्टेटस कोड दिखाता है. अगर किसी अनुरोध में कोई गड़बड़ी होती है, तो एपीआई एचटीटीपी स्टेटस कोड, स्टेटस, और गड़बड़ी के टाइप के आधार पर जवाब देता है.
साथ ही, रिस्पॉन्स के मुख्य हिस्से में गड़बड़ी की
पूरी जानकारी होती है. गड़बड़ी के जवाब का एक उदाहरण यहां दिया गया है:
{
"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 API (एपीआई) कंसोल में सेट की गई डिफ़ॉल्ट वैल्यू, हर उपयोगकर्ता के लिए हर 100 सेकंड पर 100 क्वेरी होती है. आप Google API (एपीआई) कंसोल में इस सीमा को बढ़ाकर 1,000 तक कर सकते हैं. | एक्स्पोनेंशियल बैक-ऑफ़ का इस्तेमाल करके फिर से कोशिश करें. आपको उस दर को धीमा करना होगा जिस पर आप अनुरोध भेज रहे हैं. |
403 | rateLimitExceeded |
इससे पता चलता है कि प्रोजेक्ट हर 100 सेकंड की क्वेरी के लिए तय सीमा पार हो गई है. | एक्स्पोनेंशियल बैक-ऑफ़ का इस्तेमाल करके फिर से कोशिश करें. आपको उस दर को धीमा करना होगा जिस पर आप अनुरोध भेज रहे हैं. |
403 | quotaExceeded |
इससे पता चलता है कि कोर रिपोर्टिंग एपीआई में हर व्यू (प्रोफ़ाइल) में एक साथ 10 अनुरोध किए जा चुके हैं. | एक्सपोनेंशियल बैक-ऑफ़ की मदद से, फिर से कोशिश करें. इस व्यू (प्रोफ़ाइल) के पूरा होने तक, आपको कम से कम एक जारी अनुरोध का इंतज़ार करना होगा. |
500 | internalServerError |
सर्वर में अचानक कोई गड़बड़ी हुई. | इस क्वेरी को एक से ज़्यादा बार फिर से कोशिश न करें. |
503 | backendError |
सर्वर ने एक गड़बड़ी दी. | इस क्वेरी को एक से ज़्यादा बार फिर से कोशिश न करें. |
500 या 503 रिस्पॉन्स मैनेज करना
ज़्यादा लोड होने के दौरान या ज़्यादा बड़े अनुरोधों के लिए, 500
या 503
से जुड़ी गड़बड़ी हो सकती है. बड़े अनुरोधों के लिए, डेटा को कम समय
के लिए अनुरोध करने पर विचार करें. एक्स्पोनेंशियल बैकऑफ़ लागू करने के बारे में भी सोचें.
इन गड़बड़ियों की फ़्रीक्वेंसी, व्यू (प्रोफ़ाइल) और उस व्यू से जुड़े रिपोर्टिंग डेटा की रकम पर निर्भर कर सकती है. ज़रूरी नहीं है कि एक व्यू (प्रोफ़ाइल) के लिए 500
या 503
गड़बड़ी की वजह से, अलग-अलग व्यू (प्रोफ़ाइल) के लिए उसी क्वेरी में गड़बड़ी हो.
एक्स्पोनेंशियल बैकऑफ़ लागू करना
एक्सपोनेंशियल बैकऑफ़ एक क्लाइंट की प्रोसेस है, जिसमें समय-समय पर, असफल अनुरोध की कोशिश की जा रही है. यह नेटवर्क ऐप्लिकेशन के लिए, गड़बड़ी को मैनेज करने की एक स्टैंडर्ड रणनीति है. कोर रिपोर्टिंग एपीआई को इस आधार पर डिज़ाइन किया गया है कि क्लाइंट जो अनुरोध पूरा नहीं कर पाए वे फिर से कोशिश करने का विकल्प चुनते हैं. ऐसा करने के लिए, एक्सपोनेंशियल बैकऑफ़ का इस्तेमाल किया जाता है. कोट और कोट के अलावा, एक्स्पोनेंशियल बैकऑफ़ का इस्तेमाल करने से बैंडविड्थ इस्तेमाल में आसानी होती है. साथ ही, रिस्पॉन्स मिलने पर, कम रिस्पॉन्स मिलते हैं और एक साथ कई अनुरोध होते हैं.
आसान एक्स्पोनेंशियल बैकऑफ़ लागू करने का फ़्लो नीचे दिया गया है.
- एपीआई को अनुरोध भेजने का तरीका
- गड़बड़ी का ऐसा रिस्पॉन्स पाएं जिसमें फिर से कोशिश करने लायक गड़बड़ी कोड हो
- 1 सेकंड +
random_number_milliseconds
सेकंड इंतज़ार करें - फिर से अनुरोध करें
- गड़बड़ी का ऐसा रिस्पॉन्स पाएं जिसमें फिर से कोशिश करने लायक गड़बड़ी कोड हो
- दो सेकंड और
random_number_milliseconds
सेकंड इंतज़ार करें - फिर से अनुरोध करें
- गड़बड़ी का ऐसा रिस्पॉन्स पाएं जिसमें फिर से कोशिश करने लायक गड़बड़ी कोड हो
- 4 सेकंड +
random_number_milliseconds
सेकंड इंतज़ार करें - फिर से अनुरोध करें
- गड़बड़ी का ऐसा रिस्पॉन्स पाएं जिसमें फिर से कोशिश करने लायक गड़बड़ी कोड हो
- 8 सेकंड +
random_number_milliseconds
सेकंड इंतज़ार करें - फिर से अनुरोध करें
- गड़बड़ी का ऐसा रिस्पॉन्स पाएं जिसमें फिर से कोशिश करने लायक गड़बड़ी कोड हो
- 16 सेकंड +
random_number_milliseconds
सेकंड इंतज़ार करें - फिर से अनुरोध करें
- अगर आपको अब भी गड़बड़ी मिल रही है, तो गड़बड़ी को रोकें और लॉग करें.
ऊपर दिए गए फ़्लो में, 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."