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(())
}
요청의 재시도 정책 재정의
애플리케이션에서 특정 요청의 재시도 정책을 재정의해야 하는 경우가 있습니다. 예를 들어 애플리케이션 개발자는 서비스 또는 애플리케이션의 특정 세부정보를 알고 더 많은 오류를 허용해도 안전하다고 판단할 수 있습니다.
예를 들어 보안 비밀 삭제는 한 번만 성공할 수 있으므로 멱등성이 있습니다. 하지만 클라이언트 라이브러리는 모든 삭제 작업이 안전하지 않다고 가정합니다. 요청의 정책을 재정의할 수 있습니다.
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(())
}