Il client Cloud Storage nelle librerie client di Cloud per Rust scrive gli oggetti estraendo i blocchi di payload da un tipo che implementa il tratto StreamingSource.
Alcune applicazioni generano dati in un'attività o un thread separato e devono invece eseguire il push dei blocchi di payload nel caricamento.
Questo documento mostra come eseguire il wrapping di un ricevitore di canali asincrono in un'implementazione StreamingSource in modo da poter eseguire il push dei dati in una scrittura di oggetti Cloud Storage. Se non hai mai utilizzato la libreria client, consulta prima Utilizzo di Cloud Storage con Rust.
Prima di iniziare
Prima di eseguire il codice in questo documento, completa i seguenti prerequisiti:
- Crea o seleziona un progettoGoogle Cloud con la fatturazione abilitata.
- Crea un bucket Cloud Storage nel tuo progetto.
- Configura le Credenziali predefinite dell'applicazione e concedi alla tua entità un ruolo Identity and Access Management (IAM) con l'autorizzazione per creare oggetti nel bucket, ad esempio Storage Object User (
roles/storage.objectUser).
Dipendenze
Aggiungi la libreria client di Cloud Storage e i crate di supporto utilizzati in questo documento al file Cargo.toml:
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
Converti un ricevitore di coda in un'origine di flussi di dati
Per disaccoppiare l'attività che produce i dati da quella che carica il payload,
collegale con una coda asincrona. Questo documento utilizza un canale Tokio mpsc, anche se puoi utilizzare qualsiasi canale o coda che si integra con il tuo runtime asincrono.
Per adattare il ricevitore del canale a un'implementazione StreamingSource, completa i seguenti passaggi:
Definisci una struttura che aggrega il canale
Receiver:Implementa il tratto
StreamingSourceper la struttura wrapper in modo che ogni chiamata anextattenda il chunk successivo dal ricevitore:
Trasmetti i dati dalla coda a Cloud Storage
Dopo aver implementato il tratto StreamingSource, puoi generare il caricamento dell'oggetto in un'attività in background e inviare i blocchi tramite il canale dall'attività del producer. Poiché un ricevitore di canale è un'origine dati a passaggio singolo che non implementa Seek, avvia il caricamento utilizzando send_buffered anziché send_unbuffered.
All'interno di una funzione async che accetta bucket_name nel formato
projects/_/buckets/BUCKET_ID e object_name, completa
i seguenti passaggi:
Inizializza un client
Storage:Crea un canale
mpsclimitato per ottenere gli handlesenderereceiver:Configura il caricamento dell'oggetto con
QueueSource(receiver)come origine del payload. Non aspettare ancora il futuro disend_buffered:Genera un'attività in background per gestire il caricamento mentre il producer genera i dati:
Nell'attività producer, esegui il push dei blocchi di dati nell'handle
sender:Dopo aver inviato tutti i dati, elimina l'handle
senderper chiudere il canale e segnalare la fine dello stream di oggetti:Attendi l'handle dell'attività in background per verificare che l'attività e la richiesta di caricamento siano andate a buon fine e recupera i metadati
Objectcaricati:
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo documento, elimina gli oggetti di test che hai caricato al termine.
Completamento codice
L'esempio seguente combina tutti i passaggi precedenti in una funzione completa: