การตอบกลับข้อผิดพลาดแบบมาตรฐาน
หากคำขอ 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 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d |
ระบุว่าใช้โควต้าคำขอต่อวันต่อโปรเจ็กต์หมดแล้ว | โปรดอย่าลองอีกครั้งโดยไม่แก้ไขปัญหา คุณใช้โควต้ารายวันหมดแล้ว |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 |
บ่งบอกว่าโควต้าคำขอต่อ 100 วินาทีต่อโปรเจ็กต์หมดแล้ว | ลองอีกครั้งโดยใช้ Exponential Back-off คุณต้องชะลออัตราการส่งคำขอ |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100 |
บ่งบอกว่าโควต้าคำขอต่อ 100 วินาทีต่อผู้ใช้ต่อโปรเจ็กต์หมดแล้ว | ลองอีกครั้งโดยใช้ Exponential Back-off คุณต้องชะลออัตราการส่งคำขอ |
429 | DiscoveryGroupCLIENT_PROJECT-100 RESOURCE_EXHAUSTED รายการ |
บ่งบอกว่าโควต้าคำขอการค้นหาต่อ 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."