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

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

หากคําขอ Tag Manager API สําเร็จ API จะแสดงรหัสสถานะ HTTP 200 พร้อมกับข้อมูลที่ขอในเนื้อหาของการตอบกลับ

หากข้อผิดพลาดเกิดขึ้นกับคำขอ API จะแสดงรหัสสถานะ HTTP และเหตุผลในการตอบกลับตามประเภทของข้อผิดพลาด นอกจากนี้ ส่วนเนื้อหาของการตอบกลับจะมีคำอธิบายโดยละเอียดเกี่ยวกับสาเหตุที่ทำให้เกิดข้อผิดพลาด ต่อไปนี้คือตัวอย่างของการตอบกลับข้อผิดพลาด

400 invalidParameter

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "accessNotConfigured",
    "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
   }
  ],
  "code": 403,
  "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project."
 }
}

หมายเหตุ: คำอธิบายอาจมีการเปลี่ยนแปลงได้ทุกเมื่อ ดังนั้นแอปพลิเคชันจึงไม่ควรขึ้นอยู่กับข้อความคำอธิบายจริง

การใช้ Exponential Backoff

ย้อนกลับแบบทวีคูณคือกระบวนการของไคลเอ็นต์ในการลองส่งคำขอที่ล้มเหลวใหม่เป็นระยะๆ โดยใช้ระยะเวลาที่นานขึ้น ซึ่งเป็นกลยุทธ์การจัดการข้อผิดพลาดมาตรฐานสำหรับแอปพลิเคชันเครือข่าย Tag Manager 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(tagmanager):
  """Wrapper to request Google Tag Manager data with exponential backoff.

  The makeRequest method accepts the tagmanager service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    tagmanager: The tagmanager service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(tagmanager)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded']:
        time.sleep((2 ** n) + random.random())

  print "There has been an error, the request never succeeded."