Le client Cloud Storage des bibliothèques clientes Cloud pour Rust écrit des objets en extrayant des fragments de charge utile d'un type qui implémente la caractéristique StreamingSource.
Certaines applications génèrent des données dans une tâche ou un thread distinct, et doivent plutôt transférer des fragments de charge utile vers l'importation.
Ce document explique comment encapsuler un récepteur de canal asynchrone dans une implémentation StreamingSource afin de pouvoir transférer des données vers une écriture d'objet Cloud Storage. Si vous débutez avec la bibliothèque cliente, consultez d'abord Utiliser Cloud Storage avec Rust.
Avant de commencer
Avant d'exécuter le code de ce document, assurez-vous de remplir les conditions préalables suivantes :
- Créez ou sélectionnez un projetGoogle Cloud pour lequel la facturation est activée.
- Créez un bucket Cloud Storage dans votre projet.
- Configurez les identifiants par défaut de l'application et attribuez à votre compte principal un rôle Identity and Access Management (IAM) avec l'autorisation de créer des objets dans le bucket, par exemple "Utilisateur d'objets Storage" (
roles/storage.objectUser).
Dépendances
Ajoutez la bibliothèque cliente Cloud Storage et les crates compatibles utilisées dans ce document à votre fichier Cargo.toml :
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
Convertir un récepteur de file d'attente en source de streaming
Pour dissocier la tâche qui produit les données de celle qui importe la charge utile, connectez-les à l'aide d'une file d'attente asynchrone. Ce document utilise un canal Tokio mpsc, mais vous pouvez utiliser n'importe quel canal ou file d'attente qui s'intègre à votre environnement d'exécution asynchrone.
Pour adapter le récepteur de canal à une implémentation StreamingSource, procédez comme suit :
Définissez une structure qui encapsule le canal
Receiver:Implémentez la caractéristique
StreamingSourcepour la structure du wrapper afin que chaque appel ànextattende le prochain fragment du récepteur :
Transférer des données de la file d'attente vers Cloud Storage
Après avoir implémenté la caractéristique StreamingSource, vous pouvez générer l'importation d'objets dans une tâche en arrière-plan et envoyer des fragments via le canal à partir de votre tâche de producteur. Étant donné qu'un récepteur de canal est une source de données à un seul passage qui n'implémente pas Seek, lancez l'importation à l'aide de send_buffered plutôt que de send_unbuffered.
Dans une fonction async qui accepte bucket_name au format projects/_/buckets/BUCKET_ID et object_name, procédez comme suit :
Initialisez un client
Storage:Créez un canal
mpsclimité pour obtenir les poignéessenderetreceiver:Configurez l'importation d'objets avec
QueueSource(receiver)comme source de charge utile. N'attendez pas encore le futursend_buffered:Lancez une tâche en arrière-plan pour gérer l'importation pendant que votre producteur génère des données :
Dans la tâche du producteur, transmettez des fragments de données au handle
sender:Après avoir envoyé toutes les données, supprimez le handle
senderpour fermer le canal et signaler la fin du flux d'objets :Attendez le handle de la tâche en arrière-plan pour vérifier que la tâche et la requête d'importation ont réussi, puis récupérez les métadonnées
Objectimportées :
Effectuer un nettoyage
Pour éviter que les ressources utilisées dans ce document ne soient facturées sur votre compte Google Cloud , supprimez les objets de test que vous avez importés lorsque vous avez terminé.
Compléter le code
L'exemple suivant combine toutes les étapes précédentes dans une fonction complète :