Algunos métodos de la API de Google Cloud tardan mucho tiempo en completarse.
En lugar de bloquear hasta que finalice el trabajo, estos métodos devuelven un recurso Operation que representa una operación en curso para que tu aplicación pueda sondear su estado y resultado final.
Las bibliotecas cliente de Cloud para Rust proporcionan ayudantes para trabajar con estas operaciones de larga duración (LRO). En este documento, se muestra cómo iniciar una LRO, realizar un sondeo automático hasta que se complete, inspeccionar las actualizaciones de progreso intermedias y realizar un sondeo manual.
Antes de comenzar
En este documento, se usa Cloud Storage para mantener los ejemplos de código concretos, aunque los mismos conceptos se aplican a cualquier servicio de Google Cloud que use LRO.
Antes de ejecutar el código de este documento, completa los siguientes requisitos previos:
- Crea o selecciona un proyecto deGoogle Cloud con la facturación habilitada.
- Sigue las instrucciones de Comienza a usar Rust para configurar tu entorno de desarrollo y tus credenciales.
- Crea un bucket de Cloud Storage con el
espacio de nombres jerárquico habilitado, crea una carpeta de origen para
cambiarle el nombre y otorga a tu principal un rol de Identity and Access Management (IAM) con
permiso para administrar carpetas, como Administrador de almacenamiento (
roles/storage.admin).
Dependencias
Agrega la biblioteca cliente y los crates de LRO a tu archivo Cargo.toml:
cargo add google-cloud-storage google-cloud-lro google-cloud-longrunning anyhow
Agrega tokio para la ejecución asíncrona y los temporizadores:
cargo add tokio --features full
Inicia una operación de larga duración
En los ejemplos de este documento, se llama a la operación cambiar nombre de carpeta de Cloud Storage, que devuelve una LRO. Para iniciar una LRO
directamente y obtener el recurso Operation inicial, completa los siguientes
pasos:
Agrega declaraciones
usepara acortar las rutas de acceso de tipos:Define una función
asyncque acepte el ID de bucket, el ID de la carpeta de origen y el ID de la carpeta de destino:Inicializa el cliente de
StorageControl:Crea el compilador de solicitudes
rename_folder:Envía la solicitud y espera el recurso
Operationinicial, que representa la operación en segundo plano:
Después de iniciar la operación, espera a que finalice para recuperar el resultado final.
Sondea automáticamente una operación de larga duración
En la mayoría de los casos de uso, utiliza el método until_done del atributo Poller en lugar de llamar a send directamente. El sondeo inicia la LRO, sondea según las políticas de retirada y error del cliente, y se resuelve en la respuesta final:
Incluye el atributo
Polleren el alcance:Inicializa un cliente
StorageControly configura el compilador de solicitudesrename_folder:Llama a
polleryuntil_doneen el compilador de solicitudes para esperar a que se complete y, luego, imprime el resultado:
Código completo de sondeo automático
En la siguiente función, se muestra el ejemplo completo de sondeo automático:
Sondea una operación de larga duración con resultados intermedios
El método until_done devuelve solo el resultado final y omite las actualizaciones de metadatos
intermedias. Si tu aplicación necesita actualizaciones de progreso mientras se ejecuta la LRO, obtén un poller con poller y llama a poll en un bucle:
Importa
PolleryPollingResult:Convierte el compilador de solicitudes en un poller con
poller:Llama a
poller.poll().awaiten un bucle para procesar los estadosInProgress,PollingErroryCompleted:
Cuando llamas a poll directamente, tu bucle controla la demora entre los intentos de sondeo. Elige un retraso que se adapte a la duración prevista de la operación.
Código completo para el sondeo con resultados intermedios
En la siguiente función, se muestra el bucle poll completo:
Sondea manualmente una operación de larga duración
Aunque el atributo Poller controla casi todos los casos de uso, también puedes sondear un Operation de forma manual con get_operation:
Después de iniciar la LRO con
send, ingresa un bucle y verifica el campodone:Inspecciona
operation.result. El camporesultes unOptionporque algunas operaciones, como las eliminaciones, finalizan sin devolver una carga útil. Pararename_folder, el servicio devuelve un recursoFolder:Verifica si la operación finalizó con un error. La variante de error contiene un mensaje
Statusque el siguiente ejemplo formatea en un error o que puedes convertir en un error del cliente conError::service:Si la operación se realizó correctamente, desempaca la carga útil de
Anyen el tipo de respuestaFolderesperado:Agrega un brazo comodín porque las enumeraciones en las bibliotecas cliente de Cloud para Rust están marcadas como
#[non_exhaustive]:Opcional: Mientras
operation.doneseafalse, desempacaoperation.metadatapara inspeccionar las actualizaciones de progreso:Espera antes de volver a realizar el sondeo. En este ejemplo, se suspende durante 500 ms fijos para abreviar; en el código de producción, usa la retirada exponencial truncada:
Llama a
get_operationconoperation.namepara actualizar el estado de la operación:
Código completo de sondeo manual
La siguiente función combina todos los pasos de sondeo manual: