Respons Error

Respons Error Standar

Jika permintaan Tag Manager API berhasil, API akan menampilkan kode status HTTP 200 beserta data yang diminta dalam isi respons.

Jika terjadi error pada permintaan, API akan menampilkan HTTP kode status dan alasan dalam respons berdasarkan jenis kesalahan. Selain itu, isi respons berisi deskripsi mendetail penyebab error. Berikut adalah contoh respons error:

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

Catatan: Deskripsi dapat berubah kapan saja sehingga aplikasi tidak tergantung pada teks deskripsi yang sebenarnya.

Menerapkan Backoff Eksponensial

Backoff eksponensial adalah proses klien secara berkala mencoba ulang permintaan yang gagal waktu yang meningkat. Ini adalah strategi penanganan error standar untuk aplikasi jaringan. Tag Manager API dirancang dengan harapan bahwa klien yang memilih untuk mencoba ulang permintaan yang gagal jadi menggunakan backoff eksponensial. Selain "wajib", penggunaan backoff eksponensial akan meningkatkan efisiensi penggunaan {i>bandwidth<i}, mengurangi jumlah permintaan yang diperlukan untuk respons permintaan, dan memaksimalkan throughput permintaan serentak lingkungan fleksibel App Engine.

Alur untuk mengimplementasikan backoff eksponensial sederhana adalah sebagai berikut.

  1. Buat permintaan ke API.
  2. Menerima respons error yang memiliki kode error yang bisa dicoba lagi.
  3. Tunggu 1 detik + random_number_milliseconds detik.
  4. Coba lagi permintaan.
  5. Menerima respons error yang memiliki kode error yang bisa dicoba lagi.
  6. Tunggu 2 detik + random_number_milliseconds detik.
  7. Coba lagi permintaan.
  8. Menerima respons error yang memiliki kode error yang bisa dicoba lagi.
  9. Tunggu 4 detik + random_number_milliseconds detik.
  10. Coba lagi permintaan.
  11. Menerima respons error yang memiliki kode error yang bisa dicoba lagi.
  12. Tunggu 8 detik + random_number_milliseconds detik.
  13. Coba lagi permintaan.
  14. Menerima respons error yang memiliki kode error yang bisa dicoba lagi.
  15. Tunggu 16 detik + random_number_milliseconds detik.
  16. Coba lagi permintaan.
  17. Jika Anda masih mendapatkan error, hentikan dan catat error tersebut.

Dalam alur di atas, random_number_milliseconds adalah nilai acak jumlah milidetik kurang dari atau sama dengan 1.000. Ini diperlukan untuk menghindari {i>error<i} kunci tertentu dalam beberapa implementasi serentak. random_number_milliseconds harus ditentukan ulang setelah setiap waktu tunggu.

Catatan: Waktu tunggu selalu (2 ^ n) + random_number_milliseconds, dengan n adalah bilangan bulat yang meningkat secara monoton yang awalnya ditentukan sebagai 0. Variabel n bertambah 1 untuk setiap iterasi (setiap permintaan).

Algoritma disetel untuk dihentikan jika n adalah 5. Batas ini adalah hanya untuk menghentikan klien agar tidak terus mencoba tanpa batas, dan mengakibatkan total penundaan sekitar 32 detik sebelum permintaan dianggap sebagai “kesalahan yang tidak dapat dipulihkan.”

Kode Python berikut adalah implementasi dari yang di atas alur pemulihan dari kesalahan yang terjadi dalam metode yang disebut 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."