Le librerie client di Cloud per Java utilizzano i nuovi tentativi per gestire errori imprevisti e temporanei (ovvero il server non è temporaneamente disponibile). Più tentativi possono comportare una risposta riuscita dal server.
I valori di ripetizione predefiniti vengono selezionati dal team che gestisce il servizio cloud. Questi valori di nuovi tentativi vengono configurati per RPC. Un servizio può scegliere di attivare i tentativi solo per un sottoinsieme di RPC. È possibile che ogni RPC per un servizio sia configurata in modo diverso.
Parametri per nuovi tentativi
Le librerie client hanno due tipi di parametri di ripetizione da configurare:
- Retry Status Code: insieme di codici di stato su cui riprovare.
- Timeout per i tentativi o limiti dei tentativi:RetrySettings configurabile per definire i limiti.
Posizione predefinita della configurazione dei nuovi tentativi RPC
Le configurazioni di nuovi tentativi predefinite sono definite nel file
{Client}StubSettings generato. Utilizzando la RPC ExportAssets in
Java-Asset v3.64.0 come esempio, le configurazioni di nuovi tentativi predefinite sono definite
nelle seguenti posizioni:
Retry Status Codes: configurato nel file
AssetServiceStubSettings.java. Esempio:ImmutableMap.Builder<String, ImmutableSet<StatusCode.Code>> definitions = ImmutableMap.builder(); definitions.put("no_retry_0_codes", ImmutableSet.copyOf(Lists.<StatusCode.Code>newArrayList())); // ... More StatusCode configurations RETRYABLE_CODE_DEFINITIONS = definitions.build();Parametri per i nuovi tentativi:configurati nel file
AssetServiceStubSettings.java. Esempio:ImmutableMap.Builder<String, RetrySettings> definitions = ImmutableMap.builder(); RetrySettings settings = null; settings = RetrySettings.newBuilder() .setInitialRpcTimeoutDuration(Duration.ofMillis(60000L)) .setRpcTimeoutMultiplier(1.0) .setMaxRpcTimeoutDuration(Duration.ofMillis(60000L)) .setTotalTimeoutDuration(Duration.ofMillis(60000L)) .build(); definitions.put("no_retry_0_params", settings); // ... More RetrySettings configurations RETRY_PARAM_DEFINITIONS = definitions.build();
Entrambe le configurazioni sono mappate all'RPC nel file
AssetServiceStubSettings.java. Esempio:
builder
.exportAssetsSettings()
.setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_0_codes"))
.setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_0_params"));
Concetti di ripetizione dei tentativi della libreria client
L'abilitazione dei tentativi consente a una RPC di effettuare più tentativi per ottenere una chiamata
riuscita. Una chiamata riuscita è una risposta di un server che restituisce un codice di stato OK (da gRPC) o un codice di stato 2xx (da HttpJson).
Tentativo e operazione
La seguente configurazione di RetrySettings modifica le impostazioni di riprova sia per
il tentativo che per l'operazione di una chiamata RPC:
settings =
RetrySettings.newBuilder()
.setInitialRetryDelayDuration(Duration.ofMillis(100L))
.setRetryDelayMultiplier(1.3)
.setMaxRetryDelayDuration(Duration.ofMillis(60000L))
.setInitialRpcTimeoutDuration(Duration.ofMillis(60000L))
.setRpcTimeoutMultiplier(1.0)
.setMaxRpcTimeoutDuration(Duration.ofMillis(60000L))
.setTotalTimeoutDuration(Duration.ofMillis(60000L))
.build();
Un tentativo RPC è il singolo tentativo effettuato e un'operazione RPC è un insieme di tutti i tentativi effettuati. Una singola chiamata RPC avrà uno o più tentativi in una singola operazione.
I limiti RPC individuali (un tentativo) sono controllati dalle seguenti impostazioni:
setInitialRetryDelayDuration: ritardo prima del primo tentativo.setRetryDelayMultiplier: moltiplicatore del ritardo applicato tra un tentativo e l'altro.setMaxRetryDelayDuration: ritardo massimo possibile per un tentativo.setInitialRpcTimeoutDuration: timeout per il primo tentativo.setRpcTimeoutMultiplier: moltiplicatore del timeout applicato tra un tentativo e l'altro.setMaxRpcTimeoutDuration: timeout massimo possibile per un tentativo.
I limiti RPC totali (un'operazione) sono controllati dalle seguenti impostazioni:
setTotalTimeoutDuration: Timeout totale consentito per l'intera operazione.setMaxAttempts: Numero massimo di tentativi consentiti.
Quando viene eseguito un nuovo tentativo di RPC
Un RPC verrà ritentato quando si verificano entrambi gli scenari seguenti:
- La libreria riceve un codice di stato non riuscito e il codice di stato è contrassegnato come riprovabile.
- L'invocazione di una RPC supera i limiti della singola RPC, ma rientra comunque nei limiti totali delle RPC.
Se è vero solo uno scenario o se nessuno dei due è vero, il tentativo di RPC non verrà ripetuto.
Ad esempio, se il timeout totale non è stato superato, ma l'ultimo tentativo riceve un codice di stato che non può essere riprovato.
Inoltre, quando configuri i limiti RPC, puoi configurare i limiti per ogni tentativo, nonché i limiti RPC totali. L'algoritmo di ripetizione garantirà che i limiti di un singolo tentativo rientrino nei limiti totali della RPC.
Backoff esponenziale
Il backoff esponenziale ripeterà le richieste con un ritardo crescente tra un tentativo e l'altro. Questo valore di ritardo dei tentativi può essere limitato con un valore massimo di ritardo dei tentativi.
Ad esempio, le seguenti configurazioni di nuovi tentativi possono comportare i seguenti tempi di ritardo:
Initial Retry Delay: 100ms
Retry Delay Multiplier: 2.0
Max Retry Delay: 500ms
- Tentativo 1: ritardo di 100 ms
- Tentativo 2: ritardo di 200 ms
- Tentativo 3: ritardo di 400 ms
- Tentativo 4: ritardo di 500 ms
- …
- Tentativo X: ritardo di 500 ms
Tremolio
Il jitter è una varianza aggiuntiva che utilizza la casualità per distribuire l'invocazione delle RPC. Google Cloud Le librerie client attivano sempre il jitter per i tentativi. In questo modo, i tentativi vengono distribuiti senza sovraccaricare il server.
Il valore casuale di jitter viene calcolato in base al ritardo di ripetizione. Prima di ogni
tentativo, l'algoritmo di ripetizione calcola un valore casuale compreso tra
[1, RETRY_DELAY]. Questo valore calcolato è il ritardo approssimativo prima che la
richiesta venga inviata al server.
Le seguenti configurazioni di nuovi tentativi utilizzano jitter e backoff esponenziale.
Initial Retry Delay: 100ms
Retry Delay Multiplier: 2.0
Max Retry Delay: 500ms
Ciò potrebbe comportare i seguenti tempi di ritardo:
- Tentativo 1: ritarda un valore casuale compreso tra
[1, 100]ms - Tentativo 2: ritarda un valore casuale compreso tra
[1, 200]ms - Tentativo 3: ritarda un valore casuale compreso tra
[1, 400]ms - Tentativo 4: ritarda un valore casuale compreso tra
[1, 500]ms - …
- Tentativo X: ritarda un valore casuale compreso tra
[1, 500]ms
Esempi di nuovi tentativi
Gli esempi seguenti mostrano il comportamento di alcune configurazioni di nuovi tentativi.
Nessun nuovo tentativo
Questo esempio disabilita i tentativi.
RetrySettings defaultNoRetrySettings =
RetrySettings.newBuilder()