Library klien Google Cloud untuk Rust dapat otomatis mencoba lagi operasi yang gagal karena error sementara. Pelajari cara membuat dan menyesuaikan loop percobaan ulang, menerapkan kebijakan percobaan ulang umum untuk semua permintaan, dan mengganti kebijakan default untuk permintaan tertentu.
Prasyarat
Contoh dalam panduan ini menggunakan layanan Secret Manager. Namun, konsep yang sama berlaku untuk layanan Google Cloud lainnya.
Sebelum melanjutkan, ikuti Membuat dan mengakses secret menggunakan Secret Manager untuk mengaktifkan dan mengautentikasi Secret Manager API.
Dependensi
Setelah mengaktifkan Secret Manager, deklarasikan dependensi Anda dalam
file Cargo.toml Anda:
cargo add google-cloud-secretmanager-v1
Mengonfigurasi kebijakan percobaan ulang default
Contoh ini menggunakan kebijakan Aip194Strict. Kebijakan ini didasarkan pada
pedoman dalam AIP-194, yang mendokumentasikan kondisi saat klien Google API
harus otomatis mencoba lagi permintaan.
Untuk menjadikan kebijakan Aip194Strict sebagai kebijakan default untuk layanan, tetapkan
kebijakan selama inisialisasi klien:
let client = SecretManagerService::builder()
.with_retry_policy(Aip194Strict)
.build()
.await?;
Setelah menetapkan kebijakan, Anda dapat menggunakan layanan seperti biasa:
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);
}
Mengonfigurasi kebijakan percobaan ulang default: kode lengkap
Contoh kode ini menerapkan kebijakan Aip194Strict ke layanan Secret Manager.
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(())
}
Mengonfigurasi kebijakan percobaan ulang default dengan batas
Secara default, kebijakan Aip194Strict tidak membatasi jumlah upaya percobaan ulang atau waktu yang dihabiskan untuk mencoba ulang permintaan. Namun, Anda dapat menambahkan batas ke
kebijakan.
Misalnya, Anda dapat membatasi jumlah percobaan dan waktu yang dihabiskan dalam loop percobaan ulang:
let client = SecretManagerService::builder()
.with_retry_policy(
Aip194Strict
.with_attempt_limit(5)
.with_time_limit(Duration::from_secs(15)),
)
.build()
.await?;
Dengan konfigurasi ini, permintaan akan berfungsi seperti biasa:
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);
}
Mengonfigurasi kebijakan percobaan ulang default dengan batas: kode lengkap
Contoh kode ini menerapkan kebijakan Aip194Strict ke layanan Secret Manager dengan batas percobaan dan batas waktu kustom.
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(())
}
Mengganti kebijakan percobaan ulang untuk permintaan
Terkadang aplikasi perlu mengganti kebijakan percobaan ulang untuk permintaan tertentu. Misalnya, developer aplikasi mungkin mengetahui detail spesifik layanan atau aplikasi dan menentukan bahwa lebih banyak error dapat ditoleransi dengan aman.
Misalnya, menghapus rahasia bersifat idempoten, karena hanya dapat berhasil satu kali. Namun, library klien mengasumsikan bahwa semua operasi penghapusan tidak aman. Anda dapat mengganti kebijakan untuk permintaan:
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?;
Mengganti kebijakan percobaan ulang untuk permintaan: kode lengkap
Contoh kode ini menggantikan batas percobaan dan batas waktu untuk permintaan tertentu ke layanan 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(())
}