再試行ポリシーの構成

Rust 用の Google Cloud クライアント ライブラリは、一時的なエラーが原因で失敗したオペレーションを自動的に再試行できます。再試行ループを作成してカスタマイズする方法、すべてのリクエストに共通の再試行ポリシーを実装する方法、特定のリクエストのデフォルト ポリシーをオーバーライドする方法について説明します。

前提条件

このガイドの例では、Secret Manager サービスを使用しています。ただし、同じコンセプトは他の Google Cloud サービスでも機能します。

続行する前に、Secret Manager を使用してシークレットを作成してアクセスするに沿って、Secret Manager API を有効にして認証します。

依存関係

Secret Manager を有効にしたら、Cargo.toml ファイルで依存関係を宣言します。

cargo add google-cloud-secretmanager-v1

デフォルトの再試行ポリシーを構成する

この例では、Aip194Strict ポリシーを使用します。このポリシーは、Google API クライアントがリクエストを自動的に再試行する条件を文書化した AIP-194 のガイドラインに基づいています。

Aip194Strict ポリシーをサービスのデフォルト ポリシーにするには、クライアントの初期化時にポリシーを設定します。

   let client = SecretManagerService::builder()
       .with_retry_policy(Aip194Strict)
       .build()
       .await?;

ポリシーを設定すると、通常どおりサービスを使用できます。

   let mut list = client
       .list_secrets()
       .set_parent(format!("projects/{project_id}"))
       .by_item();
   while let Some(secret) = list.next().await {
       let secret = secret?;
       println!("  secret={}", secret.name);
   }

デフォルトの再試行ポリシーを構成する: 完全なコード

このコードサンプルは、Secret Manager サービスに Aip194Strict ポリシーを適用します。

use google_cloud_gax::paginator::ItemPaginator as _;
use google_cloud_gax::retry_policy::Aip194Strict;
use google_cloud_secretmanager_v1::client::SecretManagerService;

pub async fn sample(project_id: &str) -> anyhow::Result<()> {
   let client = SecretManagerService::builder()
       .with_retry_policy(Aip194Strict)
       .build()
       .await?;

   let mut list = client
       .list_secrets()
       .set_parent(format!("projects/{project_id}"))
       .by_item();
   while let Some(secret) = list.next().await {
       let secret = secret?;
       println!("  secret={}", secret.name);
   }

   Ok(())
}

上限付きのデフォルトの再試行ポリシーを構成する

デフォルトでは、Aip194Strict ポリシーは再試行回数やリクエストの再試行に費やされる時間を制限しません。ただし、ポリシーに上限を追加することはできます。

たとえば、試行回数と再試行ループで費やされる時間の両方を制限できます。

   let client = SecretManagerService::builder()
       .with_retry_policy(
           Aip194Strict
               .with_attempt_limit(5)
               .with_time_limit(Duration::from_secs(15)),
       )
       .build()
       .await?;

この構成では、リクエストは通常どおり機能します。

   let mut list = client
       .list_secrets()
       .set_parent(format!("projects/{project_id}"))
       .by_item();
   while let Some(secret) = list.next().await {
       let secret = secret?;
       println!("  secret={}", secret.name);
   }

制限付きのデフォルトの再試行ポリシーを構成する: 完全なコード

このコードサンプルは、カスタムの試行上限と時間上限を使用して、Secret Manager サービスに Aip194Strict ポリシーを適用します。

use google_cloud_gax::paginator::ItemPaginator as _;
use google_cloud_gax::retry_policy::Aip194Strict;
use google_cloud_gax::retry_policy::RetryPolicyExt;
use google_cloud_secretmanager_v1::client::SecretManagerService;
use std::time::Duration;


pub async fn sample(project_id: &str) -> anyhow::Result<()> {
   let client = SecretManagerService::builder()
       .with_retry_policy(
           Aip194Strict
               .with_attempt_limit(5)
               .with_time_limit(Duration::from_secs(15)),
       )
       .build()
       .await?;


   let mut list = client
       .list_secrets()
       .set_parent(format!("projects/{project_id}"))
       .by_item();
   while let Some(secret) = list.next().await {
       let secret = secret?;
       println!("  secret={}", secret.name);
   }


   Ok(())
}

リクエストの再試行ポリシーをオーバーライドする

アプリケーションで、特定のリクエストの再試行ポリシーをオーバーライドする必要がある場合があります。たとえば、アプリケーション デベロッパーはサービスやアプリケーションの詳細を把握しており、より多くのエラーを許容しても安全であると判断する場合があります。

たとえば、Secret の削除は 1 回しか成功できないため、べき等です。ただし、クライアント ライブラリはすべての削除オペレーションが安全でないと想定しています。リクエストのポリシーをオーバーライドできます。

   client
       .delete_secret()
       .set_name(format!("projects/{project_id}/secrets/{secret_id}"))
       .with_retry_policy(
           AlwaysRetry
               .with_attempt_limit(5)
               .with_time_limit(Duration::from_secs(15)),
       )
       .send()
       .await?;

リクエストの再試行ポリシーをオーバーライドする: 完全なコード

このコードサンプルは、Secret Manager サービスに対する特定のリクエストの試行回数と時間制限をオーバーライドします。

use google_cloud_gax::options::RequestOptionsBuilder;
use google_cloud_gax::retry_policy::AlwaysRetry;
use google_cloud_gax::retry_policy::RetryPolicyExt;
use google_cloud_secretmanager_v1::client::SecretManagerService;
use std::time::Duration;


pub async fn sample(
   client: &SecretManagerService,
   project_id: &str,
   secret_id: &str,
) -> anyhow::Result<()> {
   client
       .delete_secret()
       .set_name(format!("projects/{project_id}/secrets/{secret_id}"))
       .with_retry_policy(
           AlwaysRetry
               .with_attempt_limit(5)
               .with_time_limit(Duration::from_secs(15)),
       )
       .send()
       .await?;


   Ok(())
}