Der Cloud Storage-Client in den Cloud-Clientbibliotheken für Rust schreibt Objekte, indem er Nutzlastblöcke aus einem Typ abruft, der das StreamingSource-Trait implementiert.
Einige Anwendungen generieren Daten in einer separaten Aufgabe oder einem separaten Thread und müssen stattdessen Nutzlastblöcke an den Upload senden.
In diesem Dokument wird gezeigt, wie Sie einen asynchronen Kanalempfänger in eine StreamingSource-Implementierung einbinden, um Daten in einen Cloud Storage-Objektschreibvorgang zu übertragen. Wenn Sie die Clientbibliothek noch nicht kennen, lesen Sie zuerst Cloud Storage mit Rust verwenden.
Hinweis
Bevor Sie den Code in diesem Dokument ausführen, müssen die folgenden Voraussetzungen erfüllt sein:
- Erstellen oder wählen Sie ein Google Cloud -Projekt mit aktivierter Abrechnung aus.
- Erstellen Sie einen Cloud Storage-Bucket in Ihrem Projekt.
- Konfigurieren Sie die Standardanmeldedaten für Anwendungen und weisen Sie Ihrem Hauptkonto eine IAM-Rolle (Identity and Access Management) mit der Berechtigung zum Erstellen von Objekten im Bucket zu, z. B. Storage-Objekt-Nutzer (
roles/storage.objectUser).
Abhängigkeiten
Fügen Sie die Cloud Storage-Clientbibliothek und die in diesem Dokument verwendeten unterstützenden Crates der Datei Cargo.toml hinzu:
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
Warteschlangenempfänger in eine Streamingquelle umwandeln
Wenn Sie die Aufgabe, die Daten erzeugt, von der Aufgabe, die die Nutzlast hochlädt, entkoppeln möchten, verbinden Sie sie mit einer asynchronen Warteschlange. In diesem Dokument wird ein Tokio-mpsc-Kanal verwendet. Sie können jedoch jeden Kanal oder jede Warteschlange verwenden, die sich in Ihre asynchrone Laufzeit einbinden lässt.
So passen Sie den Kanalempfänger an eine StreamingSource-Implementierung an:
Definieren Sie eine Struktur, die den Kanal
Receiverumschließt:Implementieren Sie das
StreamingSource-Trait für die Wrapper-Struktur, sodass bei jedem Aufruf vonnextauf den nächsten Block vom Empfänger gewartet wird:
Daten aus der Warteschlange in Cloud Storage streamen
Nachdem Sie das StreamingSource-Trait implementiert haben, können Sie den Objekt-Upload in einer Hintergrundaufgabe starten und Chunks über den Kanal von Ihrer Producer-Aufgabe senden. Da ein Kanalempfänger eine Single-Pass-Datenquelle ist, die Seek nicht implementiert, starten Sie den Upload mit send_buffered anstelle von send_unbuffered.
Führen Sie in einer async-Funktion, die bucket_name im Format projects/_/buckets/BUCKET_ID und object_name akzeptiert, die folgenden Schritte aus:
Initialisieren Sie einen
Storage-Client:Erstellen Sie einen begrenzten
mpsc-Kanal, um die Handlessenderundreceiverabzurufen:Konfigurieren Sie den Objekthochladevorgang mit
QueueSource(receiver)als Nutzlastquelle. Warten Sie noch nicht auf diesend_buffered-Zukunft:Starten Sie eine Hintergrundaufgabe, um den Upload zu steuern, während Ihr Producer Daten generiert:
Übertragen Sie in der Producer-Aufgabe Datenblöcke in das
sender-Handle:Nachdem alle Daten gesendet wurden, löschen Sie das Handle
sender, um den Kanal zu schließen und das Ende des Objektstreams zu signalisieren:Warten Sie auf das Handle für die Hintergrundaufgabe, um zu prüfen, ob sowohl die Aufgabe als auch die Uploadanfrage erfolgreich waren, und rufen Sie die hochgeladenen
Object-Metadaten ab:
Bereinigen
Damit Ihrem Google Cloud Konto die in diesem Dokument verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie die Testobjekte, die Sie hochgeladen haben, wenn Sie fertig sind.
Vollständiger Code
Im folgenden Beispiel werden alle vorherigen Schritte zu einer vollständigen Funktion kombiniert: