O cliente do Cloud Storage nas bibliotecas de cliente do Cloud para Rust grava objetos
extraindo blocos de payload de um tipo que implementa a característica StreamingSource.
Alguns aplicativos geram dados em uma tarefa ou linha de execução separada e precisam enviar
blocos de payload para o upload.
Neste documento, mostramos como encapsular um receptor de canal assíncrono em uma
implementação de StreamingSource para que seja possível enviar dados para uma
gravação de objeto do Cloud Storage. Se você não conhece a biblioteca de cliente, consulte
Como usar o Cloud Storage com Rust primeiro.
Antes de começar
Antes de executar o código neste documento, conclua os seguintes pré-requisitos:
- Crie ou selecione um projeto doGoogle Cloud com o faturamento ativado.
- Crie um bucket do Cloud Storage no projeto.
- Configure o Application Default Credentials e conceda ao principal um
papel do Identity and Access Management (IAM) com permissão para criar objetos no
bucket, como Usuário de objetos do Storage (
roles/storage.objectUser).
Dependências
Adicione a biblioteca de cliente do Cloud Storage e os crates de suporte usados neste documento ao arquivo Cargo.toml:
cargo add google-cloud-storage anyhow bytes
cargo add tokio --features rt,sync
Converter um receptor de fila em uma fonte de streaming
Para separar a tarefa que produz dados da tarefa que faz upload do payload,
conecte-as com uma fila assíncrona. Neste documento, usamos um canal mpsc do Tokio, mas é possível usar qualquer canal ou fila que se integre ao ambiente de execução assíncrono.
Para adaptar o receptor de canal em uma implementação de StreamingSource, siga
estas etapas:
Defina uma struct que encapsule o canal
Receiver:Implemente a característica
StreamingSourcepara a struct do wrapper para que cada chamada paranextaguarde o próximo bloco do receptor:
Transmitir dados da fila para o Cloud Storage
Depois de implementar a característica StreamingSource, é possível gerar o upload do objeto
em uma tarefa em segundo plano e enviar blocos pelo canal da tarefa do
produtor. Como um receptor de canal é uma fonte de dados de passagem única que não
implementa Seek, inicie o upload usando send_buffered em vez de
send_unbuffered.
Em uma função async que aceita bucket_name no formato
projects/_/buckets/BUCKET_ID e object_name, siga
estas etapas:
Inicialize um cliente
Storage:Crie um canal
mpsclimitado para receber os identificadoressenderereceiver:Configure o upload do objeto com
QueueSource(receiver)como a origem do payload. Ainda não aguarde o futuro desend_buffered:Gere uma tarefa em segundo plano para impulsionar o upload enquanto o produtor gera dados:
Na tarefa do produtor, envie blocos de dados para o identificador
sender:Depois de enviar todos os dados, solte o identificador
senderpara fechar o canal e sinalizar o fim do fluxo de objetos:Aguarde o identificador da tarefa em segundo plano para verificar se a tarefa e a solicitação de upload foram bem-sucedidas e recupere os metadados de
Objectenviados:
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste documento, exclua os objetos de teste que você enviou quando terminar.
Preencher código
O exemplo a seguir combina todas as etapas anteriores em uma função completa: