1. Introdução

O Cloud Tasks é um serviço de enfileiramento totalmente gerenciado para administrar a execução, o envio e a entrega de um grande número de tarefas.
O Cloud Tasks permite separar os trabalhos, chamados de tarefas, que podem ser executados de maneira independente (por exemplo, uma tarefa para atualizar uma entrada de banco de dados), fora do fluxo principal do aplicativo, e enviá-los para processamento assíncrono, usando gerenciadores criados por você.
A tarefa transferida é adicionada a uma fila, em que fica até ser executada ou falhar. Com base na configuração, a fila também pode funcionar como um controle de fluxo de expedição. Você cria e configura a fila, que é gerenciada pelo serviço Cloud Tasks. Depois que as tarefas são adicionadas, a fila as despacha e garante que elas sejam processadas de forma confiável pelos workers.

Alguns dos principais recursos do Cloud Tasks são:
- Destinos HTTP:adicione tarefas que segmentem de maneira segura qualquer serviço HTTP em execução no Compute Engine, no Google Kubernetes Engine, no Cloud Run, no Cloud Functions ou em sistemas locais usando autenticação OAuth/OIDC padrão do setor.
- Eliminação de duplicação de tarefas: tarefas adicionadas várias vezes serão enviadas somente uma vez.
- Entrega garantida: as tarefas são entregues pelo menos uma vez, e a maioria delas é entregue exatamente uma vez.
- Controles de taxa e de novas tentativas:controle a execução definindo a taxa de envio das tarefas, o número máximo de tentativas e o tempo mínimo de espera entre elas.
- Agendamento futuro:controle o horário em que uma tarefa será executada.
Neste codelab, você vai aprender primeiro a criar e usar uma fila normal do Cloud Tasks para tarefas de destino HTTP. Em seguida, você vai aprender a usar a substituição de URI HTTP no nível da fila e a nova API BufferTask para armazenar em buffer solicitações HTTP com mais facilidade usando o Cloud Tasks.
O que você vai aprender
- Como criar tarefas de destino HTTP.
- Como criar tarefas de destino HTTP com a nova substituição de URI HTTP no nível da fila.
- Como mudar as tarefas pendentes com a nova substituição de URI HTTP no nível da fila.
- Como armazenar em buffer solicitações HTTP com mais facilidade usando a nova API BufferTask.
2. Configuração e requisitos
Configuração de ambiente personalizada
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.



- O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
- O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Iniciar o Cloud Shell
Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.
No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.
3. Criar uma fila regular para tarefas de destino HTTP
Nesta primeira etapa, você vai aprender a criar uma fila normal do Cloud Tasks e adicionar tarefas HTTP para direcionar um serviço do Cloud Run.

O que são tarefas de destino HTTP?
As tarefas de destino HTTP podem segmentar qualquer serviço HTTP em execução no Compute Engine, no Google Kubernetes Engine, no Cloud Run, no Cloud Functions ou em sistemas locais de maneira segura usando a autenticação OAuth/OIDC padrão do setor.
Implantar um serviço do Cloud Run
Primeiro, verifique se as APIs necessárias estão ativadas:
gcloud services enable \ cloudtasks.googleapis.com \ run.googleapis.com
Implante um serviço do Cloud Run que vai servir como destino das tarefas HTTP:
SERVICE1=hello1 REGION=us-central1 gcloud run deploy $SERVICE1 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Criar uma fila do Cloud Tasks
Crie uma fila normal do Cloud Tasks:
QUEUE1=http-queue LOCATION=us-central1 gcloud tasks queues create $QUEUE1 --location=$LOCATION
Pause a fila temporariamente para observar as tarefas HTTP à medida que são criadas:
gcloud tasks queues pause $QUEUE1 --location=$LOCATION
4. Criar e testar uma tarefa HTTP
Nesta etapa, você vai criar uma tarefa HTTP para direcionar a fila criada anteriormente.
Criar uma tarefa HTTP
É possível criar tarefas HTTP usando gcloud:
gcloud tasks create-http-task \
--queue=$QUEUE1 \
--location=$LOCATION \
--url=$SERVICE1_URL \
--method=GET
Opcional:também é possível criar uma tarefa HTTP com bibliotecas de cliente. Por exemplo, confira o Program.cs para uma amostra em C# em que uma solicitação HTTP é encapsulada em um Task e um TaskRequest antes de ser enviada ao Cloud Tasks com um CloudTasksClient:
var taskRequest = new CreateTaskRequest
{
Parent = new QueueName(projectId, location, queue).ToString(),
Task = new Task
{
HttpRequest = new HttpRequest
{
HttpMethod = HttpMethod.Get,
Url = url
}
}
};
var client = CloudTasksClient.Create();
var response = client.CreateTask(taskRequest);
Execute o comando a seguir para criar e adicionar a tarefa à fila:
dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL
Testar a tarefa HTTP
Nesse ponto, a tarefa é criada, mas ainda não é executada, porque a fila está pausada. Para verificar isso, liste as filas:
gcloud tasks queues list --location=$LOCATION
A fila vai estar no estado PAUSED:
QUEUE_NAME STATE http-queue PAUSED
Retomar a fila:
gcloud tasks queues resume $QUEUE --location=$LOCATION
Verifique os registros do serviço do Cloud Run:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
O serviço do Cloud Run recebeu uma solicitação GET do Cloud Tasks:
httpRequest: latency: 0.227597158s protocol: HTTP/1.1 remoteIp: 35.243.23.192 requestMethod: GET requestSize: '415' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks
5. Criar uma fila com uma configuração de roteamento
Nesta etapa, você vai aprender a criar uma fila do Cloud Tasks com uma configuração de roteamento para adicionar uma substituição de URI HTTP usando o recurso Configuração de roteamento de tarefas no nível da fila. Em seguida, você vai adicionar tarefas HTTP para segmentar o primeiro serviço do Cloud Run e observar que a configuração de roteamento substitui o URI para rotear tarefas para o segundo serviço do Cloud Run.

O que é a configuração de roteamento de tarefas no nível da fila?
A configuração de roteamento de tarefas no nível da fila muda o roteamento de tarefas HTTP para toda a fila em todas as tarefas pendentes e novas. Isso facilita a criação de tarefas, já que o destino HTTP não precisa ser definido no nível da tarefa, e transfere mais controle para o provedor de serviços, que pode definir o destino de todas as tarefas em uma fila (por exemplo, rotear o tráfego para um back-end diferente se o original estiver inativo).
A configuração a seguir pode ser definida no nível da fila:
- Cabeçalhos: os cabeçalhos no nível da fila, quando especificados nesse nível, vão inserir ou atualizar os cabeçalhos de todas as tarefas na fila.
- Método HTTP: quando especificado no nível da fila, substitui o método HTTP de todas as tarefas na fila.
- URI de destino: host, caminho, consulta, porta e esquema (HTTP ou HTTPS) podem ser substituídos individualmente.
- Autorização: a configuração do OIDC/OAuth especificada no nível da fila vai substituir a configuração do OIDC/OAuth no nível da tarefa.
Implantar um segundo serviço do Cloud Run
Implante um segundo serviço do Cloud Run que vai servir como destino da substituição do URI HTTP mais tarde:
SERVICE2=hello2 REGION=us-central1 gcloud run deploy $SERVICE2 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Salve o host do URL do serviço para mais tarde:
SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)') SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')
Criar uma fila do Cloud Tasks com uma configuração de roteamento
Crie uma fila com uma configuração de roteamento com substituição de URI HTTP para o segundo serviço do Cloud Run.
QUEUE2=http-queue-uri-override gcloud beta tasks queues create $QUEUE2 \ --http-uri-override=host:$SERVICE2_HOST \ --location=$LOCATION
O substituto de URI se refere ao segundo serviço do Cloud Run. Qualquer tarefa HTTP adicionada à fila terá o host do URI original substituído. É possível conferir a configuração da fila:
gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION
Você vai notar que o httpTarget tem um uriOverride apontando para o host do segundo serviço:
httpTarget:
uriOverride:
host: hello2-idcwffc3yq-uc.a.run.app
pathOverride: {}
queryOverride: {}
...
Pause a fila temporariamente para observar as tarefas HTTP à medida que são criadas:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
6. Criar e testar uma tarefa HTTP para a fila com a configuração de roteamento
Nesta etapa, você vai criar uma tarefa HTTP para direcionar o primeiro serviço e observar que o URI dele é substituído pela fila para apontar para o segundo serviço.
Criar uma tarefa HTTP
Crie uma tarefa HTTP com o URL do primeiro serviço:
gcloud tasks create-http-task \
--queue=$QUEUE2 \
--location=$LOCATION \
--url=$SERVICE1_URL \
--method=GET
Testar a tarefa HTTP
Retomar a fila:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
O segundo serviço do Cloud Run (não o primeiro) recebeu uma solicitação GET HTTP do Cloud Tasks devido à substituição:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE2" --limit 1
--- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello2-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
7. Mudar as tarefas pendentes com a configuração de roteamento
Também é possível usar a configuração de roteamento para mudar o URI HTTP de todas as tarefas pendentes em uma fila. Isso é útil se o serviço de back-end ficar inativo e você quiser rotear rapidamente para outro serviço. Vamos ver como isso funciona nesta etapa.
Pause a fila de novo:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
Crie uma tarefa HTTP com google.com como o URL da tarefa:
gcloud tasks create-http-task \
--queue=$QUEUE2 \
--location=$LOCATION \
--url=https://www.google.com \
--method=GET
A tarefa está pendente porque a fila está pausada.
Agora, atualize a substituição do URI HTTP para apontar para o primeiro serviço. Isso vai substituir o host da tarefa pendente de google.com para o host do primeiro serviço:
SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') gcloud beta tasks queues update $QUEUE2 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
Retomar a fila:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
O primeiro serviço do Cloud Run recebeu uma solicitação GET HTTP do Cloud Tasks devido à substituição (em vez de google.com):
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1 --- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
8. Criar uma fila para a API BufferTask
Normalmente, você cria tarefas usando a API Tasks em gcloud ou nas bibliotecas de cliente do Tasks. Isso sobrecarrega os aplicativos para encapsular solicitações HTTP em tarefas usando bibliotecas de cliente e também cria uma dependência entre aplicativos e as bibliotecas de cliente de tarefas.
Nesta etapa, você vai aprender a aproveitar a substituição de URI HTTP no nível da fila e a nova API BufferTask para criar tarefas de destino HTTP com mais facilidade, basta enviar uma solicitação HTTP. Qualquer aplicativo que possa enviar solicitações HTTP agora pode criar tarefas de destino HTTP.

O que é a API BufferTask?
A API CreateTask é a maneira antiga de criar tarefas e exige que o cliente envie um objeto Task para a API com todos os campos obrigatórios definidos.
A API BufferTask é um novo recurso que permite aos usuários criar uma tarefa HTTP sem precisar fornecer nenhuma configuração de tarefa (URL HTTP, cabeçalhos, autorização), permitindo que você simplesmente envie uma mensagem ou o corpo da sua solicitação para a API Buffer.
Isso facilita a integração com serviços, já que o Cloud Tasks agora pode ser implantado na frente do seu serviço sem precisar de mudanças no código do lado do cliente. Qualquer solicitação HTTP arbitrária enviada à API BufferTask será encapsulada como um objeto Task e entregue ao destino definido no nível da fila.
Para usar a API BufferTask, a fila precisa ter a configuração de URI de destino definida. Em outras palavras, o recurso Configuração de roteamento no nível da fila é um pré-requisito para usar a API BufferTask.
Criar uma fila do Cloud Tasks com configuração de roteamento
Crie uma fila com uma configuração de roteamento que aponta para o primeiro serviço implantado na etapa anterior:
SERVICE1=hello1 SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') QUEUE3=http-queue-uri-override-buffer gcloud beta tasks queues create $QUEUE3 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
Pause a fila temporariamente para observar as tarefas HTTP à medida que são criadas:
gcloud tasks queues pause $QUEUE3 --location=$LOCATION
9. Armazenar solicitações HTTP em buffer com a API BufferTask
Nesta etapa, você vai armazenar em buffer solicitações HTTP GET ou POST simples com a API BufferTask. Por baixo dos panos, o Cloud Tasks vai encapsular essas solicitações HTTP em tarefas HTTP com as configurações padrão de configuração de roteamento da fila.
Primeiro, faça login para receber um token de acesso e defina algumas variáveis:
gcloud auth application-default login ACCESS_TOKEN=$(gcloud auth application-default print-access-token) PROJECT_ID=$(gcloud config get-value project) TASKS_QUEUES_API="https://cloudtasks.googleapis.com/v2beta3/projects/$PROJECT_ID/locations/$LOCATION/queues"
Criar uma tarefa HTTP
Crie uma tarefa HTTP com a API BufferTask. Observe como é uma solicitação HTTP GET simples, sem a necessidade de criar uma tarefa:
curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN"
Crie outra tarefa HTTP com HTTP POST e um corpo:
curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d "{'message': 'Hello World'}"
Opcional:também é possível criar uma tarefa HTTP com bibliotecas de cliente. Por exemplo, confira o Program.cs para um exemplo em C# em que uma solicitação HTTP GET é enviada diretamente à API BufferTask sem precisar encapsular em um Task ou usar a biblioteca de cliente do Cloud Tasks:
var BufferTaskApiUrl = $"https://cloudtasks.googleapis.com/v2beta3/projects/{ProjectId}/locations/{Location}/queues/{Queue}/tasks:buffer";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {AccessToken}");
var response = await client.GetAsync(BufferTaskApiUrl);
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {content}");
}
É possível executá-lo da seguinte forma:
dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN
A API BufferTask cria uma tarefa com base nas solicitações HTTP e adiciona a URL das configurações de configuração de roteamento da fila para o URI.
Testar a tarefa HTTP
Retomar a fila:
gcloud tasks queues resume $QUEUE3 --location=$LOCATION
Você vai notar que o serviço do Cloud Run recebeu solicitações HTTP GET e POST do Cloud Tasks:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 4
--- httpRequest: latency: 0.002279292s protocol: HTTP/1.1 remoteIp: 35.243.23.42 requestMethod: POST requestSize: '777' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5450' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks ... httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
10. Parabéns
Parabéns, você concluiu o codelab.
Como acompanhamento, confira o artigo Cloud Tasks como um buffer entre o Pub/Sub e o Cloud Run para ver um exemplo real de como esses novos recursos do Cloud Tasks podem ajudar a criar facilmente uma fila do buffer entre serviços.
Limpeza (opcional)
Para evitar cobranças, é uma boa ideia limpar os recursos.
Se você não precisar do projeto, basta excluí-lo:
gcloud projects delete $PROJECT_ID
Se você precisar do projeto, exclua os recursos individualmente.
Exclua os serviços do Cloud Run:
gcloud run services delete $SERVICE1 --region $REGION gcloud run services delete $SERVICE2 --region $REGION
Exclua as filas do Cloud Tasks:
gcloud tasks queues delete $QUEUE1 --location=$LOCATION gcloud tasks queues delete $QUEUE2 --location=$LOCATION gcloud tasks queues delete $QUEUE3 --location=$LOCATION
O que aprendemos
- Como criar tarefas de destino HTTP.
- Como criar tarefas de destino HTTP com a nova substituição de URI HTTP no nível da fila.
- Como mudar as tarefas pendentes com a nova substituição de URI HTTP no nível da fila.
- Como armazenar em buffer solicitações HTTP com mais facilidade usando a nova API BufferTask.