クライアントサイドの再試行を構成する

Java 用 Cloud クライアント ライブラリは、再試行を使用して、予期しない一時的な障害(サーバーが一時的に利用できない)を処理します。複数回試行することで、サーバーから成功レスポンスが返されることがあります。

デフォルトの再試行値は、クラウド サービスを運用するチームによって選択されます。これらの再試行値は RPC ごとに構成されます。サービスは、RPC のサブセットに対してのみ再試行を有効にできます。サービスの RPC ごとに異なる構成が設定されている可能性があります。

再試行パラメータ

クライアント ライブラリには、構成する再試行パラメータが 2 種類あります。

  1. 再試行ステータス コード: 再試行するステータス コードのセット。
  2. 再試行タイムアウトまたは試行の上限: 上限を定義する構成可能な RetrySettings

デフォルトの RPC 再試行構成の場所

デフォルトの再試行構成は、生成された {Client}StubSettings ファイルで定義されます。Java-Asset v3.64.0 の ExportAssets RPC を例として使用すると、デフォルトの再試行構成は次の場所に定義されます。

  • 再試行ステータス コード: AssetServiceStubSettings.java ファイルで構成されます。例:

    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();
    
  • 再試行パラメータ: AssetServiceStubSettings.java ファイルで構成されます。 例:

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

どちらの構成も、AssetServiceStubSettings.java ファイルの RPC にマッピングされます。例:

builder
  .exportAssetsSettings()
  .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_0_codes"))
  .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_0_params"));

クライアント ライブラリの再試行のコンセプト

再試行を有効にすると、RPC は複数回試行して呼び出しを成功させることができます。呼び出しが成功すると、サーバーから OK ステータス コード(gRPC から)または 2xx ステータス コード(HttpJson から)が返されます。

試行とオペレーション

次の RetrySettings 構成では、RPC の試行とオペレーションの両方の再試行設定が変更されます。

settings =
  RetrySettings.newBuilder()
      .setInitialRetryDelayDuration(Duration.ofMillis(100L))
      .setRetryDelayMultiplier(1.3)
      .setMaxRetryDelayDuration(