Respons Error

Respons Error Standar

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

Jika terjadi error bersama permintaan, API akan menampilkan kode status HTTP dan alasan dalam respons berdasarkan jenis error. Selain itu, isi respons berisi deskripsi mendetail tentang 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 boleh bergantung pada teks deskripsi yang sebenarnya.

Mengimplementasikan Backoff Eksponensial

Backoff eksponensial adalah proses saat klien yang secara berkala mencoba kembali permintaan yang gagal selama jangka waktu yang lebih lama. Ini adalah strategi penanganan error standar untuk aplikasi jaringan. Tag Manager API dirancang dengan ekspektasi bahwa klien yang memilih untuk mencoba kembali permintaan yang gagal akan melakukannya menggunakan backoff eksponensial. Selain "diperlukan", penggunaan backoff eksponensial akan meningkatkan efisiensi penggunaan bandwidth, mengurangi jumlah permintaan yang diperlukan untuk mendapatkan respons yang berhasil, dan memaksimalkan throughput permintaan dalam lingkungan serentak.

Alur untuk mengimplementasikan backoff eksponensial sederhana adalah sebagai berikut.

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

Pada alur di atas, random_number_milliseconds adalah angka acak milidetik yang kurang dari atau sama dengan 1.000. Hal ini diperlukan untuk menghindari error penguncian tertentu dalam beberapa implementasi serentak. random_number_milliseconds harus ditetapkan ulang setelah setiap periode 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 diberlakukan hanya untuk menghentikan klien agar tidak terus mencoba tanpa batas, dan mengakibatkan penundaan total sekitar 32 detik sebelum permintaan dianggap "error yang tidak dapat dipulihkan".

Kode Python berikut adalah implementasi dari alur di atas untuk pemulihan dari error 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."