Rust 用 Cloud クライアント ライブラリの Cloud Storage クライアントは、StreamingSource 特性を実装する型からペイロード チャンクを pull してオブジェクトを書き込みます。一部のアプリケーションでは、別のタスクまたはスレッドでデータを生成し、代わりにペイロード チャンクをアップロードに push する必要があります。
このドキュメントでは、非同期チャネル レシーバを StreamingSource 実装でラップして、Cloud Storage オブジェクトの書き込みにデータを push する方法について説明します。クライアント ライブラリを初めて使用する場合は、まず Rust で Cloud Storage を使用するをご覧ください。
始める前に
このドキュメントのコードを実行する前に、次の前提条件を満たしてください。
- 課金が有効になっている Google Cloud プロジェクトを作成または選択します。
- プロジェクトで Cloud Storage バケットを作成します。
- アプリケーションのデフォルト認証情報を構成し、バケットにオブジェクトを作成する権限(Storage オブジェクト ユーザー(
roles/storage.objectUser)など)を持つ Identity and Access Management(IAM)ロールをプリンシパルに付与します。
依存関係
このドキュメントで使用されている Cloud Storage クライアント ライブラリとサポート クレートを Cargo.toml ファイルに追加します。
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
キュー レシーバーをストリーミング ソースに変換する
データを生成するタスクとペイロードをアップロードするタスクを切り離すには、非同期キューで接続します。このドキュメントでは、Tokio の mpsc チャネルを使用しますが、非同期ランタイムと統合する任意のチャネルまたはキューを使用できます。
チャンネル レシーバーを StreamingSource 実装に適合させるには、次の手順を行います。
チャネル
Receiverをラップする構造体を定義します。ラッパー構造体に
StreamingSourceトレイトを実装して、nextを呼び出すたびにレシーバーからの次のチャンクを待機するようにします。
キューから Cloud Storage にデータをストリーミングする
StreamingSource トレイトを実装したら、バックグラウンド タスクでオブジェクトのアップロードを生成し、プロデューサー タスクからチャネルを介してチャンクを送信できます。チャネル レシーバーは Seek を実装しないシングルパス データソースであるため、send_unbuffered ではなく send_buffered を使用してアップロードを開始します。
projects/_/buckets/BUCKET_ID 形式と object_name 形式の bucket_name を受け入れる async 関数内で、次の手順を完了します。
Storageクライアントを初期化します。senderハンドルとreceiverハンドルを取得するために、境界付きmpscチャンネルを作成します。ペイロード ソースとして
QueueSource(receiver)を使用してオブジェクトのアップロードを構成します。send_bufferedの future はまだ待機しないでください。プロデューサーがデータを生成している間に、アップロードを駆動するバックグラウンド タスクを生成します。
プロデューサー タスクで、データチャンクを
senderハンドルに push します。すべてのデータを送信したら、
senderハンドルをドロップしてチャネルを閉じ、オブジェクト ストリームの終了を通知します。バックグラウンド タスク ハンドルを待機して、タスクとアップロード リクエストの両方が成功したことを確認し、アップロードされた
Objectメタデータを取得します。
クリーンアップ
このドキュメントで使用したリソースについて Google Cloud アカウントに課金されないようにするには、アップロードしたテスト オブジェクトを削除します。
コードを補完する
次の例では、上記のすべてのステップを 1 つの関数にまとめています。