การตอบกลับข้อผิดพลาด

การตอบกลับข้อผิดพลาดแบบมาตรฐาน

หากคำขอ 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 อย่างง่ายมีดังนี้

  1. ส่งคำขอไปยัง API
  2. รับการตอบกลับข้อผิดพลาดที่มีรหัสข้อผิดพลาดซึ่งลองอีกครั้งได้
  3. รอ 1 วินาที + random_number_milliseconds วินาที
  4. ลองส่งคำขออีกครั้ง
  5. รับการตอบกลับข้อผิดพลาดที่มีรหัสข้อผิดพลาดซึ่งลองอีกครั้งได้
  6. รอ 2 วินาที + 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 คือจำนวนมิลลิวินาทีแบบสุ่มที่น้อยกว่าหรือเท่ากับ 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."