El cliente de Cloud Storage en las bibliotecas cliente de Cloud para Rust escribe objetos
extrayendo fragmentos de carga útil de un tipo que implementa el atributo StreamingSource.
Algunas aplicaciones generan datos en una tarea o un subproceso independientes y, en su lugar,
necesitan enviar fragmentos de carga útil a la carga.
En este documento, se muestra cómo unir un receptor de canal asíncrono en una
implementación de StreamingSource para que puedas enviar datos a una
escritura de objetos de Cloud Storage. Si es la primera vez que usas la biblioteca cliente, consulta
Usa Cloud Storage con Rust primero.
Antes de comenzar
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.
- Crea un bucket de Cloud Storage en tu proyecto.
- Configura las credenciales predeterminadas de la aplicación y otorga a tu principal un
rol de Identity and Access Management (IAM) con permiso para crear objetos en el
bucket, como Usuario de objetos de almacenamiento (
roles/storage.objectUser).
Dependencias
Agrega la biblioteca cliente de Cloud Storage y los crates de apoyo que se usan en
este documento a tu archivo Cargo.toml:
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
Convierte un receptor de cola en una fuente de transmisión
Para desvincular la tarea que produce datos de la tarea que sube la carga útil,
conéctalas con una cola asíncrona. En este documento, se usa un canal mpsc de Tokio, aunque puedes usar cualquier canal o cola que se integre en tu entorno de ejecución asíncrono.
Para adaptar el receptor de canales a una implementación de StreamingSource, completa los siguientes pasos:
Define un struct que una el canal
Receiver:Implementa el atributo
StreamingSourcepara la estructura de wrapper de modo que cada llamada anextespere el siguiente fragmento del receptor:
Transmite datos de la cola a Cloud Storage
Después de implementar el atributo StreamingSource, puedes generar la carga del objeto
en una tarea en segundo plano y enviar fragmentos a través del canal desde tu tarea
de productor. Debido a que un receptor de canal es una fuente de datos de un solo paso que no implementa Seek, inicia la carga con send_buffered en lugar de send_unbuffered.
Dentro de una función async que acepte bucket_name en el formato
projects/_/buckets/BUCKET_ID y object_name, completa
los siguientes pasos:
Inicializa un cliente de
Storage:Crea un canal
mpsclimitado para obtener los controladoressenderyreceiver:Configura la carga de objetos con
QueueSource(receiver)como la fuente de la carga útil. Aún no esperes el futuro desend_buffered:Genera una tarea en segundo plano para controlar la carga mientras tu productor genera datos:
En la tarea del productor, envía fragmentos de datos al controlador
sender:Después de enviar todos los datos, descarta el controlador
senderpara cerrar el canal y marcar el final del flujo de objetos:Espera el controlador de tareas en segundo plano para verificar que la tarea y la solicitud de carga se hayan realizado correctamente, y recupera los metadatos de
Objectsubidos:
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en este documento, borra los objetos de prueba que subiste cuando termines.
Completar código
En el siguiente ejemplo, se combinan todos los pasos anteriores en una función completa: