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

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

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

  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."