Configura i nuovi tentativi lato client

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:

  1. Retry Status Code: insieme di codici di stato su cui riprovare.
  2. 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:

I limiti RPC totali (un'operazione) sono controllati dalle seguenti impostazioni:

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()