Risposte di errore standard
Se una richiesta API Tag Manager ha esito positivo,
l'API restituisce un codice di stato HTTP 200
insieme
i dati richiesti nel corpo della risposta.
Se si verifica un errore con una richiesta, l'API restituisce una richiesta HTTP codice di stato e motivo della risposta in base al tipo di errore. Inoltre, il corpo della risposta contiene una descrizione dettagliata della causa dell'errore. Ecco un esempio di risposta di errore:
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."
}
}
Nota: la descrizione può cambiare in qualsiasi momento. pertanto le applicazioni non dovrebbero dipendere dal testo della descrizione.
Implementazione del backoff esponenziale
Backoff esponenziale è il processo con cui un client prova periodicamente a inviare una richiesta non riuscita sempre più a lungo. È una strategia di gestione degli errori standard per le applicazioni di rete. L'API Tag Manager è progettata con l'aspettativa che i client che scelgono di ritentare le richieste non riuscite utilizzando il backoff esponenziale. Oltre ad essere "obbligatorio", il backoff esponenziale aumenta l'efficienza dell'utilizzo della larghezza di banda, riduce il numero di richieste necessarie per avere una buona e massimizza la velocità effettiva delle richieste in ambienti cloud-native.
Il flusso per l'implementazione del backoff esponenziale semplice è il seguente.
- Effettua una richiesta all'API.
- Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
- Attendi 1 secondo +
random_number_milliseconds
secondi. - Riprova la richiesta.
- Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
- Attendi 2 secondi +
random_number_milliseconds
secondi. - Riprova la richiesta.
- Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
- Attendi 4 secondi +
random_number_milliseconds
secondi. - Riprova la richiesta.
- Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
- Attendi 8 secondi +
random_number_milliseconds
secondi. - Riprova la richiesta.
- Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
- Attendi 16 secondi +
random_number_milliseconds
secondi. - Riprova la richiesta.
- Se continui a ricevere un errore, interrompi e registra l'errore.
Nel flusso riportato sopra, random_number_milliseconds
è un metodo
numero di millisecondi inferiore o uguale a 1000. Questa operazione è necessaria
per evitare determinati errori di blocco in alcune implementazioni simultanee.
random_number_milliseconds
deve essere ridefinito dopo ogni attesa.
Nota: l'attesa è sempre
(2 ^ n) + random_number_milliseconds
, dove
n è un numero intero monotonico inizialmente definito
pari a 0. La variabile n viene incrementata di 1 per ogni iterazione
(ogni richiesta).
L'algoritmo è impostato per terminare quando n è 5. Questo tetto è solo per impedire ai client di riprovare all'infinito comporta un ritardo totale di circa 32 secondi prima che una richiesta è considerato "un errore irreversibile".
Il seguente codice Python è un'implementazione della versione precedente
flusso per il ripristino dagli errori che si verificano in un metodo chiamato
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."