ספריות הלקוח של Rust יכולות לנסות באופן אוטומטי לבצע מחדש פעולות שנכשלו בגלל שגיאות זמניות. Google Cloud במאמר הזה מוסבר איך ליצור ולשנות לולאות ניסיון חוזר, איך להטמיע מדיניות ניסיון חוזר משותפת לכל הבקשות ואיך לבטל את מדיניות ברירת המחדל לבקשות ספציפיות.
דרישות מוקדמות
בדוגמאות במדריך הזה נעשה שימוש בשירות Secret Manager. עם זאת, אותם מושגים רלוונטיים גם לשירותים אחרים של Google Cloud .
לפני שממשיכים, צריך לפעול לפי ההוראות במאמר יצירה וגישה לסוד באמצעות Secret Manager כדי להפעיל את Secret Manager API ולאמת אותו.
תלויות
אחרי שמפעילים את Secret Manager, מכריזים על יחסי התלות בקובץ Cargo.toml:
cargo add google-cloud-secretmanager-v1
הגדרת מדיניות ברירת המחדל לניסיון חוזר
בדוגמה הזו נעשה שימוש במדיניות Aip194Strict. המדיניות הזו מבוססת על ההנחיות שב-AIP-194, שמתעד את התנאים שבהם לקוח של Google API צריך לנסות לשלוח מחדש בקשה באופן אוטומטי.
כדי להגדיר את המדיניות 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);
}
הגדרת מדיניות ברירת המחדל לניסיון חוזר: קוד מלא
בדוגמת הקוד הזו מיושמת המדיניות Aip194Strict בשירות 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(())
}
הגדרת מדיניות ברירת המחדל לניסיון חוזר עם מגבלות
כברירת מחדל, מדיניות 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);
}
הגדרת מדיניות ברירת המחדל לניסיון חוזר עם מגבלות: קוד מלא
בדוגמת הקוד הזו מוחלת מדיניות Aip194Strict על השירות Secret Manager עם מגבלת ניסיונות ומגבלת זמן מותאמות אישית.
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(())
}