Las bibliotecas cliente de Google Cloud para Rust pueden reintentar automáticamente las operaciones que fallan debido a errores transitorios. Aprende a crear y personalizar bucles de reintento, implementar una política de reintento común para todas las solicitudes y anular las políticas predeterminadas para solicitudes específicas.
Requisitos previos
En los ejemplos de esta guía, se usa el servicio de Secret Manager. Sin embargo, los mismos conceptos funcionan para otros Google Cloud servicios.
Antes de continuar, sigue los pasos que se indican en Crea un secreto y accede a él con Secret Manager para habilitar y autenticar la API de Secret Manager.
Dependencias
Después de habilitar Secret Manager, declara tus dependencias en el archivo Cargo.toml:
cargo add google-cloud-secretmanager-v1
Configura la política de reintentos predeterminada
En este ejemplo, se usa la política Aip194Strict. Esta política se basa en los lineamientos de AIP-194, que documenta las condiciones en las que un cliente de la API de Google debe reintentar automáticamente una solicitud.
Para que la política Aip194Strict sea la política predeterminada de un servicio, configúrala durante la inicialización del cliente:
let client = SecretManagerService::builder()
.with_retry_policy(Aip194Strict)
.build()
.await?;
Una vez que hayas establecido la política, podrás usar el servicio como de costumbre:
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);
}
Configura la política de reintentos predeterminada: código completo
En esta muestra de código, se aplica la política Aip194Strict al servicio de 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(())
}
Configura la política de reintentos predeterminada con límites
De forma predeterminada, la política Aip194Strict no limita la cantidad de intentos de reintento ni el tiempo dedicado a reintentar solicitudes. Sin embargo, puedes agregar límites a la política.
Por ejemplo, puedes limitar la cantidad de intentos y el tiempo que se dedica al bucle de reintento:
let client = SecretManagerService::builder()
.with_retry_policy(
Aip194Strict
.with_attempt_limit(5)
.with_time_limit(Duration::from_secs(15)),
)
.build()
.await?;
Con esta configuración, las solicitudes funcionarán como de costumbre:
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);
}
Configura la política de reintentos predeterminada con límites: código completo
En esta muestra de código, se aplica la política Aip194Strict al servicio de Secret Manager con un límite de intentos y un límite de tiempo personalizados.
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(())
}
Cómo anular la política de reintentos para una solicitud
A veces, las aplicaciones deben anular la política de reintentos para una solicitud específica. Por ejemplo, el desarrollador de la aplicación podría conocer detalles específicos del servicio o la aplicación, y determinar que es seguro tolerar más errores.
Por ejemplo, borrar un secreto es idempotente, ya que solo puede tener éxito una vez. Sin embargo, la biblioteca cliente supone que todas las operaciones de eliminación son inseguras. Puedes anular la política para una solicitud:
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?;
Anula la política de reintentos para una solicitud: código completo
En esta muestra de código, se anulan el límite de intentos y el límite de tiempo para una solicitud específica al servicio de 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(())
}