การตอบกลับข้อผิดพลาดมาตรฐาน
หากคำขอ Reporting API เสร็จสมบูรณ์ API จะแสดงผล 200
หากข้อผิดพลาดเกิดขึ้นกับคำขอ API จะแสดงรหัสสถานะ HTTP, สถานะ และเหตุผลในการตอบกลับตามประเภทของข้อผิดพลาด
นอกจากนี้ ส่วนเนื้อหาของการตอบกลับจะมีคำอธิบายโดยละเอียดเกี่ยวกับสาเหตุที่ทำให้เกิดข้อผิดพลาด ต่อไปนี้คือตัวอย่างการตอบกลับข้อผิดพลาด
{
"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 | AnalyticsDefaultGroupCLIENT_PROJECT-1d RESOURCE_EXHAUSTED รายการ |
ระบุว่าโควต้าคำขอต่อวันต่อโปรเจ็กต์หมดแล้ว | อย่าลองอีกครั้งโดยไม่แก้ไขปัญหา คุณใช้โควต้ารายวันหมดแล้ว |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 |
ระบุว่าโควต้าคำขอต่อ 100 วินาทีต่อโปรเจ็กต์หมดแล้ว | ลองอีกครั้งโดยใช้ Exponential Backoff คุณจะต้องชะลอความเร็วในการส่งคำขอ |
429 | AnalyticsDefaultGroupUSER-100 RESOURCE_EXHAUSTED รายการ |
ระบุว่าโควต้าคำขอต่อ 100 วินาทีต่อผู้ใช้ต่อโปรเจ็กต์หมดแล้ว | ลองอีกครั้งโดยใช้ Exponential Backoff คุณจะต้องชะลอความเร็วในการส่งคำขอ |
429 | RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100 |
บ่งบอกว่าโควต้าคำขอการค้นพบต่อ 100 วินาทีหมดแล้ว | การตอบสนองการค้นหาไม่มีการเปลี่ยนแปลงบ่อยนัก ให้แคชการตอบกลับการค้นพบไว้ในเครื่อง หรือลองอีกครั้งโดยใช้ Exponential Backoff คุณจะต้องชะลออัตราการส่งคำขอ |
500 | INTERNAL |
เกิดข้อผิดพลาดที่ไม่คาดคิดกับเซิร์ฟเวอร์ | อย่าลองใช้คำค้นหานี้ซ้ำมากกว่า 1 ครั้ง |
503 | BACKEND_ERROR |
เซิร์ฟเวอร์แสดงผลข้อผิดพลาด | อย่าลองใช้คำค้นหานี้ซ้ำมากกว่า 1 ครั้ง |
503 | UNAVAILABLE |
บริการไม่สามารถดำเนินการตามคำขอได้ | กรณีนี้น่าจะเป็นเงื่อนไขชั่วคราว และอาจแก้ไขได้โดยการลองอีกครั้งโดยใช้ Exponential Backoff |
การใช้ Exponential Backoff
Exponential Backoff คือกระบวนการของไคลเอ็นต์ในการส่งคำขอที่ล้มเหลวซ้ำเป็นระยะๆ เป็นระยะเวลาที่เพิ่มขึ้น ซึ่งก็คือกลยุทธ์การจัดการข้อผิดพลาดมาตรฐานสำหรับแอปพลิเคชันเครือข่าย Reporting API ออกแบบมาโดยคาดหวังให้ไคลเอ็นต์ที่เลือกที่จะลองส่งคำขอที่ล้มเหลวอีกครั้งจะดำเนินการดังกล่าวโดยใช้ Exponential Backoff นอกจากจะ "จำเป็น" แล้ว การใช้ Exponential Backoff จะช่วยเพิ่มประสิทธิภาพของการใช้งานแบนด์วิดท์ ลดจำนวนคำขอที่ต้องใช้เพื่อให้การตอบสนองประสบความสำเร็จ และเพิ่มอัตราการส่งข้อมูลของคำขอในสภาพแวดล้อมที่เกิดขึ้นพร้อมกันให้ได้มากที่สุด
ขั้นตอนในการใช้งาน Exponential Backoff อย่างง่ายมีดังนี้
- ส่งคำขอไปยัง API
- รับการตอบกลับข้อผิดพลาดซึ่งมีรหัสข้อผิดพลาดที่ลองใหม่ได้
- รอ 1 วินาที +
random_number_milliseconds
วินาที - ลองส่งคำขออีกครั้ง
- รับการตอบกลับข้อผิดพลาดซึ่งมีรหัสข้อผิดพลาดที่ลองใหม่ได้
- รอ 2 วินาที +
random_number_milliseconds
วินาที - ลองส่งคำขออีกครั้ง
- รับการตอบกลับข้อผิดพลาดซึ่งมีรหัสข้อผิดพลาดที่ลองใหม่ได้
- รอ 4 วินาที +
random_number_milliseconds
วินาที - ลองส่งคำขออีกครั้ง
- รับการตอบกลับข้อผิดพลาดซึ่งมีรหัสข้อผิดพลาดที่ลองใหม่ได้
- รอ 8 วินาที +
random_number_milliseconds
วินาที - ลองส่งคำขออีกครั้ง
- รับการตอบกลับข้อผิดพลาดซึ่งมีรหัสข้อผิดพลาดที่ลองใหม่ได้
- รอ 16 วินาที +
random_number_milliseconds
วินาที - ลองส่งคำขออีกครั้ง
- หากยังพบข้อผิดพลาด ให้หยุดและบันทึกข้อผิดพลาดนั้น
ในขั้นตอนข้างต้น 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(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."