Odpowiedzi na błąd

Standardowe odpowiedzi na błędy

Jeśli żądanie do interfejsu Tag Manager API zostanie zrealizowane, interfejs API zwróci kod stanu HTTP 200 wraz z żądanymi danymi w treści odpowiedzi.

Jeśli w żądaniu wystąpi błąd, interfejs API zwraca kod stanu HTTP oraz przyczynę błędu w odpowiedzi na podstawie typu błędu. Dodatkowo treść odpowiedzi zawiera szczegółowy opis przyczyny błędu. Oto przykładowa odpowiedź o błędzie:

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

Uwaga: opis może się zmienić w dowolnym momencie, więc aplikacje nie powinny zależeć od faktycznego tekstu opisu.

Wdrażanie wykładniczego ponowienia

Wykładniczy czas ponowienia to proces, w którym klient okresowo ponawia nieudane żądanie przez dłuższy czas. Jest to standardowa strategia obsługi błędów w aplikacjach sieciowych. Interfejs Tag Manager API został zaprojektowany z myślą o tym, że klienty, które ponawiają nieudane żądania, używają wykładniczego ponowienia. Poza tym, że jest „wymagane”, korzystanie z niego, zwiększa wydajność wykorzystania przepustowości, zmniejsza liczbę żądań wymaganych do uzyskania skutecznej odpowiedzi i maksymalizuje przepustowość żądań w równoczesnych środowiskach.

Proces implementacji prostego wykładniczego ponowienia jest opisany poniżej.

  1. Wyślij żądanie do interfejsu API.
  2. Otrzymanie odpowiedzi z kodem błędu, który można ponowić.
  3. Zaczekaj 1 sekundę i jeszcze random_number_milliseconds s.
  4. Ponów prośbę.
  5. Otrzymanie odpowiedzi z kodem błędu, który można ponowić.
  6. Zaczekaj 2 sekundy i jeszcze random_number_milliseconds sekund.
  7. Ponów prośbę.
  8. Otrzymanie odpowiedzi z kodem błędu, który można ponowić.
  9. Zaczekaj 4 sekundy i jeszcze random_number_milliseconds sekund.
  10. Ponów prośbę.
  11. Otrzymanie odpowiedzi z kodem błędu, który można ponowić.
  12. Zaczekaj 8 sekund i jeszcze random_number_milliseconds sekund.
  13. Ponów prośbę.
  14. Otrzymanie odpowiedzi z kodem błędu, który można ponowić.
  15. Zaczekaj 16 sekund i jeszcze random_number_milliseconds sekund.
  16. Ponów prośbę.
  17. Jeśli błąd nadal występuje, zatrzymaj go i zarejestruj.

W powyższym przykładzie random_number_milliseconds to losowa liczba milisekund, mniejsza lub równa 1000. Jest to konieczne, aby uniknąć pewnych błędów blokad w niektórych równoczesnych implementacjach. random_number_milliseconds musi być ponownie zdefiniowany po każdym oczekiwania.

Uwaga: czas oczekiwania wynosi zawsze (2 ^ n) + random_number_milliseconds, gdzie n to monotonicznie rosnąca liczba całkowita, początkowo zdefiniowana jako 0. Zmienna n zwiększa się o 1 po każdej iteracji (każde żądanie).

Algorytm kończy działanie, gdy n wynosi 5. Limit ten ma na celu wyłącznie powstrzymanie klientów od nieskończonego ponawiania prób, powodując całkowite opóźnienie (około 32 sekundy) przed uznaniem żądania za „błąd niemożliwym do naprawienia”.

Ten kod w Pythonie jest implementacją powyższego procesu usuwania błędów występujących w metodzie 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."