Como alocar tarefas pull

Quando as tarefas estão em uma fila pull, o worker pode alocá-las. Após o processamento das tarefas, ele precisa excluí-las.

Antes de começar

Contexto importante

  • Esse método é aplicável apenas a workers que estejam sendo executados em um serviço no ambiente padrão.
  • Ao usar filas pull, você é responsável pelo escalonamento dos workers com base no volume de processamento.

Como colocar tarefas em lease

Depois que as tarefas estiverem na fila, um worker poderá colocar uma ou mais delas em lease usando o método taskqueue.Lease. Pode haver um pequeno atraso até que as tarefas adicionadas recentemente usando taskqueue.Add sejam disponibilizadas por taskqueue.Lease.

Ao solicitar um lease, você especifica o número de tarefas a serem alocadas (máximo de 1.000) e a duração do lease em segundos (no máximo uma semana). A duração do lease deve ser longa o suficiente para garantir que haja tempo suficiente para a conclusão da tarefa mais lenta antes do fim do período de lease. É possível modificar um lease de tarefa usando taskqueue.ModifyLease.

Uma tarefa em lease fica indisponível para processamento por outro worker até que o lease expire.

O exemplo de código a seguir aloca 100 tarefas da fila pull-queue por uma hora:

tasks, err := taskqueue.Lease(ctx, 100, "pull-queue", 3600)

Processamento em lote com tags de tarefa

Nem todas as tarefas são iguais. Seu código pode marcar tarefas com tags e depois escolher as que serão colocadas em lease por tag. A tag funciona como um filtro. Com este exemplo de código, é possível marcar tarefas e, em seguida, alocar por tags:

_, err = taskqueue.Add(ctx, &taskqueue.Task{
	Payload: []byte("parse"), Method: "PULL", Tag: "parse",
}, "pull-queue")
_, err = taskqueue.Add(ctx, &taskqueue.Task{
	Payload: []byte("render"), Method: "PULL", Tag: "render",
}, "pull-queue")

// leases render tasks, but not parse
tasks, err = taskqueue.LeaseByTag(ctx, 100, "pull-queue", 3600, "render")

// Leases up to 100 tasks that have same tag.
// Tag is that of "oldest" task by ETA.
tasks, err = taskqueue.LeaseByTag(ctx, 100, "pull-queue", 3600, "")

Como regular taxas de pesquisa

Os workers que pesquisam a fila em busca de tarefas para alocar precisam detectar se estão tentando alocar tarefas mais rapidamente do que a fila pode fornecer. Se essa falha ocorrer, um erro de retirada será retornado de taskqueue.Lease.

Seu código precisará gerenciar esses erros, desativar a chamada de taskqueue.Lease e tentar novamente depois. Para evitar esse problema, defina um prazo maior de RPC ao chamar taskqueue.Lease e não insista quando uma solicitação de alocação retornar uma lista vazia de tarefas. Se você gerar mais de 10 solicitações de LeaseTasks por fila por segundo, apenas as 10 primeiras solicitações retornarão resultados. Se as solicitações ultrapassarem esse limite, OK será retornado sem nenhum resultado.

Como monitorar tarefas no console

Para ver informações sobre todas as tarefas e filas no aplicativo:

  1. Abra a página do Cloud Tasks no Console e procure o valor Pull na coluna Tipo.

    Ir para o Cloud Tasks

  2. Clique no nome da fila em que você está interessado e abra a página de detalhes dela. Serão exibidas todas as tarefas na fila selecionada.

Como excluir tarefas

Depois que o worker conclui uma tarefa, ele precisa excluí-la da fila. Se continuarem sendo exibidas tarefas restantes em uma fila depois que o worker terminar de processá-las, é provável que tenha ocorrido falha no worker. Nesse caso, as tarefas serão processadas por outro worker.

É possível excluir uma lista de tarefas, como a retornada por taskqueue.Lease, passando-a para taskqueue.DeleteMulti:

tasks, err = taskqueue.Lease(ctx, 100, "pull-queue", 3600)
// Perform some work with the tasks here

taskqueue.DeleteMulti(ctx, tasks, "pull-queue")